|
|
1
11
听起来好像你是在从C++中得到“const”的等价物。这在C中不存在。没有办法表明消费者不能修改一个对象的属性,但是其他的东西可以(当然,假设变化的成员是公共的)。
您可以按照建议返回foo的克隆,或者
看法
在比赛场地上,如
ReadOnlyCollection
对于集合。当然,如果你能
注意,在 领域 只读并使对象本身不可变。 目前,类型本身可以通过两种方式改变事情。它可以做到:
或
如果它只需要能够执行第二个操作,那么该字段可以是只读的,但是您仍然存在这样的问题:人们获取属性时会改变对象。如果它只需要做第一件事,实际上
它是 非常重要 了解更改字段值(使其引用不同的实例)和更改字段所引用对象的内容之间的区别。 |
|
|
2
3
不幸的是,目前在C中没有一个简单的方法可以解决这个问题。您可以提取的“只读部分”
|
|
|
3
2
复制,A
有时,当我做任何比返回底层字段更重要的事情时,我都更喜欢方法而不是属性,这取决于所涉及的工作量。方法意味着正在发生一些事情,当消费者使用您的API时,它们会为他们升起更多的标志。 |
|
|
4
1
“克隆”你接收和归还的foo对象是一种正常的做法,叫做
防御性复制
. 除非对克隆有一些用户看不见的副作用,否则绝对没有理由不这样做。它通常是唯一的方式来保护您的类的内部私有数据,特别是在C++或Java中,其中C++的思想是
只是澄清一下,可能的副作用是用户(合理地)希望返回原始对象,或者foo持有的某些资源无法正确克隆。(在这种情况下,它在执行iClonable做什么?!) |
|
|
5
1
如果你不想让任何人扰乱你的国家……不要暴露它!正如其他人所说,如果有什么东西需要查看您的内部状态,请提供它的不变表示。或者,让客户告诉 你 做点什么(谷歌的“告诉不要问”),而不是自己做。 |
|
|
6
0
为了澄清jon skeet的评论,您可以创建一个视图,它是可变foo的不可变包装类。下面是一个例子:
|
|
7
0
实际上,你可以复制C++中的C++ const的行为——你只需要手动完成。
无论什么
例如,
所以在你的情况下,你很高兴他们得到
因此,定义一个接口来描述他们可以做什么:
我们省略了变异方法,只留下了属性的getter。
然后将该接口添加到
现在在你班上
和一个地产经纪人:
这基本上是手工复制的C++
实际上,我所做的就是将信息合并到
如果你有一个
你只能打电话给警察
注意,如果
还有一个问题是,在您的产品版本之间,接口的发展不是很容易的。如果第三方可以实现您定义的接口(如果他们可以看到,他们可以自由地做),那么在未来的版本中,您不能向它添加新的方法,而不需要其他人重新编译他们的代码。但是,如果您正在编写一个可扩展库供其他人构建,那么这只是一个问题。可能是内置的
|
|
|
8
0
我在考虑类似的安全问题。可能有办法。很清楚,但不短。总的想法很简单。但是我总是找到一些方法,所以从来没有测试过它。但你可以检查一下-也许对你有用。 这是伪代码,但我希望它背后的想法是清楚的
所以在创建这个属性的类中,您可以访问setme方法,但它仍然是私有的,所以除了creator foo之外,它看起来是不可更改的。 尽管如此,对于任何比少数属性更大的属性,这可能很快就会变得非常混乱——这就是为什么我总是喜欢其他封装方式的原因。但是,如果您不允许客户更改foo对您来说非常重要,那么这是一种选择。 然而,正如我所说,这只是理论。 |