Я не пробовал, но я уверен, что isImmutable не поможет. Предполагая, что это действительно делает объект неизменяемым, он сделает неизменяемым объект, указанный instVar, а не сам instvar.
Лучше всего просто вообще не включать конкретный мутатор для переменной, а вместо этого установить его во время инициализации следующим образом:
MyClass class>>newWithFoo: aFoo
^self basicNew initializeWithFoo: aFoo; yourself
MyClass>>initializeWithFoo: aFoo
self initialize.
foo := aFoo.
Таким образом, единственный способ, которым кто-либо вне самого класса может повлиять на переменную, — это создать новый экземпляр, вызвав MyClass newWithFoo:
(Не считая использования рефлексивных методов, таких как #instVarNamed:put:
- вы практически ничего не можете с ними поделать, но любой, кто их использует, знает, что они все равно нарушают контракт класса).
person
Stuart Herring
schedule
10.11.2013