2

不変型オブジェクト (String、Integer、..) を final としてメソッドに渡すと、C++ 定数ポインターの文字を実現できます。しかし、変更可能なオブジェクトでそのような動作を強制するにはどうすればよいでしょうか?

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

私が望むのは、someType を変更せずに someMethod が someObject の状態を変更できないようにすることだけです。これは可能ですか?

4

4 に答える 4

5

一般的なケースでは、いいえ、それは不可能です。非常に限られたケースでは、同じインターフェースを提供するクラスで someType をラップできます (例については Collections.unmodifiableList() を参照してください)。

ただし、「const ポインターを渡すと、コンパイラーは const 関数の呼び出しのみを許可する」に相当するものはありません。

于 2008-12-18T13:20:06.593 に答える
2

いいえ、setXXX() (または同様の) メソッドを介してオブジェクトが変更されるのを防ぐことはできません。ただし、クローンまたはそのコピーを提出することはできます。

于 2008-12-18T13:17:44.133 に答える
1

いいえ、これは不可能だと思います。通常のアプローチは、状態を変更するすべてのメソッドが UnsupportedOperationException をスローする SomeType のアダプターを作成することです。これは、たとえば java.util.Collections.unmodifiable*-functions によって使用されます。

これにはいくつかのアプローチがあります。

  • SomeType をインターフェイスにすることができます。読み取り専用にする必要がある場合は、すべての読み取りメソッドを元のオブジェクトに委任し、すべての書き込みメソッドを実装して例外をスローするラッパーを作成するだけです。
  • または、すべての書き込みメソッドをオーバーライドする SomeType のサブクラスを作成できます

もちろん、これは実行時チェックのみを提供し、コンパイル時は提供しません。コンパイル時に必要な場合は、SomeType を読み取り専用の書き込みメソッドのないインターフェイス (またはスーパークラス) にすることができます。

于 2008-12-18T13:27:27.217 に答える
1

いいえ、できません。オブジェクトのコピーを渡すか、どのアクションがオブジェクトの状態を変更するかを知っているだけで、呼び出しを避ける必要があります。コンパイラは役に立ちません。

于 2008-12-18T13:19:52.070 に答える