首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Smalltalk如何创建不可变实例变量?

Smalltalk如何创建不可变实例变量?
EN

Stack Overflow用户
提问于 2013-11-10 01:45:34
回答 4查看 426关注 0票数 1

我有一个带有实例变量var的类。

我不希望变量被修改/分配给一个值,除非使用Class方法创建对象。

isImmutable: aBoolean是将可变对象转换为不可变对象的方法,反之亦然。

有人能给我提供正确的语法来做吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-11 09:35:53

我使用以下代码实现了它:

代码语言:javascript
运行
复制
MyClass class>>classMethod: aValue

anObject := self new value:aValue.
anObject isImmutable: true.
^anObject.
票数 0
EN

Stack Overflow用户

发布于 2013-11-10 07:02:27

我还没试过,但我很肯定isImmutable不会这么做。假设这确实使一个对象不可变,它将使instVar所指向的对象不可变,而不是instvar本身。

最好的方法是根本不为变量包括一个特定的Mutator,而是在初始化时设置它,如下所示:

代码语言:javascript
运行
复制
MyClass class>>newWithFoo: aFoo
   ^self basicNew initializeWithFoo: aFoo; yourself

MyClass>>initializeWithFoo: aFoo
   self initialize.
   foo := aFoo.

这样,类之外的任何人都可以影响变量的唯一方法是通过调用MyClass newWithFoo:创建一个新实例。

(不包括使用像#instVarNamed:put:这样的反射方法-你对它们几乎无能为力,但任何使用它们的人都知道他们违背了类的约定)。

票数 0
EN

Stack Overflow用户

发布于 2013-11-11 06:55:32

为什么要使对象不可变?声明API的方式不足以说明如何使用类而不替换实例变量吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19885341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档