2

当我将不可变类型对象(String, Integer,..) 作为 final 传递给方法时,我可以实现 C++ 常量指针的字符。但是我怎样才能在可变对象中强制执行这种行为呢?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

我想要的只是防止 someMethod 修改 someObject 的状态而不对 someType 进行任何更改。这可能吗?

4

4 回答 4

5

在一般情况下,不,这是不可能的。在非常有限的情况下,您可以将 someType 包装在提供相同接口的类中(参见 Collections.unmodifiableList() 示例)。

但是,没有等效于“传递一个 const 指针,编译器将只允许您在其上调用 const 函数”。

于 2008-12-18T13:20:06.593 回答
2

不,您不能阻止通过其 setXXX() (或类似)方法修改对象。不过,您可以交出一个克隆或副本。

于 2008-12-18T13:17:44.133 回答
1

不,这是不可能的。您必须传入对象的副本,或者仅依靠了解哪些操作对对象进行状态更改并避免调用它们 - 编译器不会帮助您。

于 2008-12-18T13:19:52.070 回答
1

不,我不认为这是可能的。通常的方法是为 SomeType 创建一个适配器,其中所有更改状态的方法都会抛出 UnsupportedOperationException。这由例如 java.util.Collections.unmodifiable*-functions 使用。

有几种方法:

  • 您可以让 SomeType 成为一个接口,当您需要它是只读的时,只需创建一个包装器,将所有读取方法委托给原始对象并实现所有写入方法以引发异常。
  • 或者您可以创建一个覆盖所有写入方法的 SomeType 的子类

这当然只会给你运行时检查,而不是编译时。如果你想要编译时,你可以让 SomeType 是一个没有写方法的接口(或超类),只有读方法。

于 2008-12-18T13:27:27.217 回答