2017-06-19 7 views
2

バイト配列をクラスに格納するには、配列をコピーするか、単に参照を渡すだけですか?クラスにbyte []を格納する

など。

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = buf; 
    } 

    private int size; 
    private Byte buffer[]; 
} 

または、

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = buf; 
    } 

    private int size; 
    private Byte buffer[] = new Byte[size]; 
} 

または、

class MyClass { 

    public MyClass(int size, Byte buf[]) { 
     this.size = size; 
     this.buffer = copyOf(buf, 5); 
    } 

    private int size; 
    private Byte buffer[]; 
} 

私は本当に配列をコピーするか、単に参照を格納する必要があるかどうか混乱していますか?

+0

secondeは、サイズが「0」の配列を作成し、それを 'buf'でオーバーライドします。最後はコピーを作成します**これは配列の参照が異なるため不変**のために良いです – AxelH

答えて

2

アレイをコピーしない場合、ソース配列に加えられた変更は、そのクラス内の新しい配列に影響します。それはおそらくあなたが望むものではありません。

Byte[]ではなく、byte[]を使用してください。あなたがコピーした場合(Bytebyteのラッパーオブジェクトで、Byteオブジェクトの配列は、byteプリミティブの1よりもはるかに多くのメモリを使用しています。

+0

こんにちは、私はソースについては気にしません。私は文字列を持っていて、 "" HelloWorld ".getBytes()'を実行します。単純にコピーせずにバイトを割り当てることはできますか?両方の方法の例を挙げてください。 – user963241

+1

"HelloWorld" .getBytes()は、新しいバイト配列を作成します。それを自分のフィールドに割り当てるだけであれば、他の参照はないので、コピーは必要ありません。 –

+0

例としては、私の最初の例は、それを直接割り当てる方法を示し、3番目はコピーを示し、2番目は間違っていることを示していると思いますか? – user963241

2

あなたのクラスの契約が何であるかを決定する必要があります。

  1. はコンテンツをコピーしないでください。より速いですが、呼び出しコードによって配列が変更された場合は、クラスが動作する可能性があります予想外に。

ですから、これらの質問に答える必要があります。それはあなたのクラスに渡された後、いくつかのコードは、配列の内容を変更するため

  • が、それはOKですか?
  • もし問題なければ、コンテンツをコピーするか、javadocにメモを書き込んで、それ以降の配列の変更がクラスを破壊する可能性があるという事実を文書化しますか?
0

参照を渡すと、元の配列が変更されるたびに配列が変更されます。 クラス内の値のみが必要な場合は、2番目の方法を選択する必要があります。その方法では、2つの配列が「分離」されているからです。

関連する問題