Здесь действительно два ответа:
1 - Да, нетрудно создать анонимные классы , которые автоматически собирают мусор.В Squeak их называют «одноклассниками», потому что типичный вариант использования - для добавления методов к одному объекту.Системы, которые используют это, например, Etoys и Tweak (хотя в Etoys классы фактически помещаются в SystemDict по историческим причинам).Вот некоторый Squeak-код, который я недавно использовал для него:
newClass := ClassBuilder new
newSubclassOf: baseClass
type: baseClass typeOfClass
instanceVariables: instVars
from: nil.
baseClass removeSubclass: newClass.
^newClass
Как правило, вы бы добавили для этого удобный метод.Затем вы можете добавить методы и создать экземпляр, и когда все экземпляры исчезнут, класс тоже будет gc'ed.
Обратите внимание, что в Java объект класса не gc'ed - внутреннийКласс компилируется точно так же, как обычный класс, он скрыт только компилятором.Напротив, в Smalltalk все это происходит во время выполнения, даже при компиляции новых методов для этого класса, что делает его сравнительно неэффективным.Существует гораздо лучший способ создания анонимного предварительно скомпилированного поведения, который заставляет нас ответить 2:
2 - Хотя это не сложно, его редко используют в Smalltalk. Причина этого заключается в том, чточто Smalltalk имеет гораздо более удобный механизм.Внутренние классы в Java чаще всего используются для создания метода на лету, реализующего определенный интерфейс.Внутреннее объявление класса необходимо только для того, чтобы компилятор был доволен безопасностью типов. В Smalltalk вы просто используете закрытие блоков. Это позволяет вам создавать поведение на лету, которое вы можете обойти.Системные библиотеки структурированы таким образом, чтобы использовать закрытие блоков.
Лично я никогда не чувствовал, что внутренние классы были чем-то необходимым для Smalltalk.