0

次のように、Key オブジェクトの配列を使用してクラス keyHandler のオブジェクトを構築するクラスがあるとします。

class KeyHandler {
    Key[] keys;
    public KeyHandler(Key[] keys) {
        this.keys=keys 
    }
    //more methods which modify key;
}

今、私はメインからこのコンストラクタを呼び出します

KeyHandler keyhandler = new KeyHandler(keys);

キー配列が main() から変更されていないことを確認したい。これどうやってするの?

4

4 に答える 4

0

KeyHandlerクラスは、キー配列の内部コピーを作成する必要があります。その後、それは安全です。

class Keyhandler {    
   private Key[] keys;
   public KeyHandler(Key[] keys) {
      this.keys = new Key[keys.length]; 
      System.arrayCopy(keys, 0, this.keys, 0, keys.length); 
   }
     //more methods which modify key;
}

キー配列を外部から操作できないようになったことに注意してください。ただし、主要なプロパティを変更することは可能です。絶対に安全にするために、キーも複製する必要があります。

于 2012-12-12T11:41:40.203 に答える
0

最良の方法は、クラスに配列のコピーを作成することです。

this.keys = Arrays.copy(keys, keys.length);

ただし、Keyオブジェクトが変更可能であり、mainメソッドが配列に保持しているキーの1つを変更する場合、ローカルコピーもその変更を監視することに注意してください。これを防ぐには、Key不変にするか、個々のKeyオブジェクトのコピーを作成します(ディープコピー)。

于 2012-12-12T11:42:13.000 に答える
0

Keyが不変クラスの場合は、配列のクローンを作成するだけです。

this.keys = keys.clone();

オブジェクトが不変でない場合Keyは、配列の要素を1つずつコピーして、ディープクローンを作成する必要があります。コピーコンストラクターがある場合Key、KeyHandlerコンストラクターは次のようになります。

this.keys = keys.clone();
for (int i = this.keys.length - 1; i >= 0; i--) {
    this.keys[i] = new Key(this.keys[i]);
}

この方法の詳細については、Webで「防御的コピー」を検索してください。

于 2012-12-12T13:41:09.970 に答える
0

これは、渡された配列のディープ コピーを作成することで実現できます。object.clone(); を使用してディープ コピーを作成します。さらに、その配列に直接アクセスしないようにするか、getArray(); で配列のディープ コピーを返すことにより、その配列を外部の変更から保護することができます。さらに Collections.unmodifiableList(); の使用を検討できます。

于 2012-12-12T11:44:42.873 に答える