2011-07-12 14 views
10

アレイのゲッターとセッターについて、いくつか質問があります。私たちはそのコンストラクタ内の配列のプライベートコピーを作成し、このようなクラスを、持っているとしますアレイのゲッターとセッター

import java.util.Arrays; 

public class Foo 
{ 
    private int[] array; 

    public Foo(int[] array) { 
     this.array = Arrays.copyOf(array, array.length); 
    } 
} 

我々が配列のみゲッターとセッターを経由して変異した/アクセスできるようにしたいです。私たちは、ユーザが直接、配列の要素を変更することができます参照を返しているとして、それはゲッターの目的に反し

public int[] getArray() { 
    return array; 
} 

:私たちはこのようになりますゲッターを持っている場合。例えばセッターのための同様

public int getElement(int index) { 
    return array[index]; 
} 

Foo foo = new Foo(someArray); 
... 
int[] bar = foo.getArray(); 
bar[0] = 123; // Now foo.array[0] = 123 and we haven't used a setter! 

だから、おそらく我々はこのようなものが必要。しかし、我々は要素ごとの基準で物事をやっているならば、我々はまた、長さを得るための手段を提供する必要があるとしている:

public int getArrayLength() { 
    return array.length; 
} 

これは、すでに1次元配列のために少し厄介です、しかし、我々は代わりに多次元配列を持っていると言う:

import java.util.Arrays; 

public class Foo 
{ 
    private int[][][] array; 

    public Foo(int[][][] array) { 
     // Code for making a deep copy here 
    } 

    public int getElement(int i, int j, int k) { 
     return array[i][j][k]; 
    } 

    public void setElement(int i, int j, int k, int value) { 
     array[i][j][k] = value; 
    } 

    public int getArrayLength() { 
     return array.length; 
    } 

    public int getArrayLength(int i) { 
     return array[i].length; 
    } 

    public int getArrayLength(int i, int j) { 
     return array[i][j].length; 
    } 
} 

これは、このような簡単な作業のために多くのコードであり、より重要なことは、実際に使用する混乱です。私たちは本当にこのようなもので終わらなければなりませんか、それとももっと良い方法がありますか?私はその場所を全面的に見てきましたが、このための「標準的な練習」はないようです。

+0

あなたはリストを見ましたか? – Jacob

+1

配列は1900年代です。 – Marcelo

答えて

7

多次元配列はまた、1次元配列である:int[a][b][c]は本当にただint[a*b*c]なので、問題はどのように安全にアクセスを提供しない、に帰着しますか?これは次のようなものです:

public class Foo { 
    private int[] array; 

    public Foo(int[] array) { 
     this.array = Arrays.copyOf(array, array.length); 
    } 

    /** @return a copy of the array */ 
    public int[] getArray() { 
     return Arrays.copyOf(array, array.length); 
    } 
} 

それだけです。

呼び出し元は配列の安全なコピーを持ち、配列が使用される通常の方法で完全に使用できます。委任メソッドの必要はありません。

1

ArrayListはどうですか、それともVectorですか?

私はこの時点で、Fooが配列にまったく裏付けされていることを明らかにしている理由はより良い質問だと思いますか?カプセル化しようとしている場合は、アクセサーとセッターをあちこちに持つ必要はありません。配列の周りにクラスラッパーを作成しようとしているのであれば、それはIntListか何かを呼び出すことをお勧めします。Fooをリストに裏付けされた具体的な実装にしてください。

1

最初の部分に関しては、ゲッターがコンストラクタのように見えない可能性がありますか?

public int[] getArray() { 
    return Arrays.copyOf(array, array.length); 
} 
0

多次元ジェネリックアレイ用の小さなAPIを作成しました。そこには、あなたの次元が何であれ、各要素のゲッター、セッターがあります。ここで

MDDAJ on github

例である:5次元の文字列配列を作成:

MDDAPseudo<String> c = new MDDAPseudo<String>(10,20,5,8,15); 
c.set("xyz", 0,0,2,1,0); // setter indices: [0][0][2][1][0] 
String s = c.get(0,0,0,0,0); // getter indices [0][0][0][0][0] 

ボヘミアンは、すでにあなたが一次元だけを使用することができます書きました。この場合、クラスPDDAPSeudo内部も次元が1つあります。しかし、APIはあなたに多次元配列のようなアクセスを提供します

関連する問題