我有一个带有实例变量var的类。
我不希望变量被修改/分配给一个值,除非使用Class方法创建对象。
isImmutable: aBoolean是将可变对象转换为不可变对象的方法,反之亦然。
有人能给我提供正确的语法来做吗?
发布于 2013-11-11 09:35:53
我使用以下代码实现了它:
MyClass class>>classMethod: aValue
anObject := self new value:aValue.
anObject isImmutable: true.
^anObject.发布于 2013-11-10 07:02:27
我还没试过,但我很肯定isImmutable不会这么做。假设这确实使一个对象不可变,它将使instVar所指向的对象不可变,而不是instvar本身。
最好的方法是根本不为变量包括一个特定的Mutator,而是在初始化时设置它,如下所示:
MyClass class>>newWithFoo: aFoo
^self basicNew initializeWithFoo: aFoo; yourself
MyClass>>initializeWithFoo: aFoo
self initialize.
foo := aFoo.这样,类之外的任何人都可以影响变量的唯一方法是通过调用MyClass newWithFoo:创建一个新实例。
(不包括使用像#instVarNamed:put:这样的反射方法-你对它们几乎无能为力,但任何使用它们的人都知道他们违背了类的约定)。
发布于 2013-11-11 06:55:32
为什么要使对象不可变?声明API的方式不足以说明如何使用类而不替换实例变量吗?
https://stackoverflow.com/questions/19885341
复制相似问题