【发布时间】:2018-02-04 21:36:54
【问题描述】:
在具体化我的问题之前,让我提供一些背景知识:我的主要编程语言是 C++ 和 Java。在使用 C++ 时,我发现应用 const 正确性很重要,即声明如下函数:
A::DoSomething( const B& arg ); // guarantees that arg is not modified
A::DoSomething() const; // guarantees that the object of type A is not modified
A::DoSomething( const B& arg ) const; // both of the above
事实上,我经常希望const 是默认值,并且必须以某种方式标记已修改的对象。
我使用const的主要原因是:
- 与其他开发人员的交流:它使代码更具表现力。
- 与编译器的通信:它有助于在编译时发现问题,有时还可以进行其他优化。
众所周知,Java 没有 const 关键字(您不能使用 final 进行上述操作),这个事实之前已在此处讨论过,请参见此处的示例:Equivalent of const(C++) in Java。
通常建议的 Java 替代方案是使您的类不可变。虽然这不是 const 的完全替代品,因为它适用于每个类而不是每个使用类的上下文,但在大多数情况下它对我来说都可以正常工作。
但是不可变类有一个大问题:不可变性并不明显。要确定一个类是否真的不可变,据我所知,你基本上必须检查完整的源代码。任何方法都可能有一个后门,通过该后门可以修改对象。
那么有没有更简单的方法来检查不可变性?或者是否有任何最佳实践以某种方式将类标记为不可变?
注意:我知道这两种语言都提供了绕过常量或不变性的“邪恶技巧”:C++ 有 const_cast,而 Java 有反射。但是对于我的问题的上下文,我们假设没有使用这些。
【问题讨论】:
-
有趣的事实:Java 确实有 a const keyword,但没有使用 ;)
-
一个类对我来说是不可变的(或有这种意图)的一个重要提示是,如果它被标记为
final。 -
非常相关:this Q/A which goes into detection of immutability for runtime code(如果不是,我会把这个 Q 当作骗子关闭)。
标签: java oop immutability