Java で同等の C++ 定数ポインタを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/377795

質問

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

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

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

役に立ちましたか?

解決

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

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

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

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

他のヒント

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

しかし、「constのポインタを渡すと、コンパイラは唯一あなたがそれにconstの機能を呼び出すことができるようになります」に相当するものはありません。

いいえ、あなたはそののsetXXX()(または類似)の方法によって変更されたオブジェクトを防ぐことはできません。あなたはしかし、クローンまたはそのコピーを手可能性があります。

いいえ、それは不可能です。あなたは、オブジェクトのコピーを渡し、または単にアクションはオブジェクトの状態を変更したものを知ることに依存しており、それらを呼び出す避けるために持っているのいずれか - コンパイラはあなたを助けにはなりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top