如何确定类是否不可变
在具体化我的问题之前,让我提供一些背景知识:我的主要编程语言是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没有关键字(你不能用上面做),这个事实之前已经在这里讨论过了,例如在这里:Java中const(C++)的等效物。const
final
通常提出的Java替代方案是使您的类不可变。虽然这不是完全替代,因为它适用于每个类,而不是每个使用类的上下文,但在大多数情况下,它对我来说工作得很好。const
但是不可变类有一个大问题:不可变性并不明显。据我所知,要找出一个类是否真的是不可变的,你基本上必须检查完整的源代码。任何方法都可以有一个后门,通过该后门可以修改对象。
那么有没有更简单的方法来检查不可变性呢?或者是否有任何最佳实践以某种方式将类标记为不可变?
注意:我知道这两种语言都提供了绕过恒定性或不可变性的“邪恶技巧”:C++具有const_cast
,Java具有反射。但是对于我的问题的上下文,让我们假设这些没有被使用。