2

たとえば、整数の配列を保持するクラスがあるとします。

Integer[] numbers;

また、配列を初期化する単純なコンストラクターがあります。

public Program()
{
    numbers = new Integer[11];
    numbers[0] = null;
}

ご覧のとおり、11要素の配列があります。

ポイントは、最初のものを index で変更することは決してないということ0です。

変更できないように、配列の最初の要素を確定する方法はありますか?

final変数のように。

4

6 に答える 6

4

いいえ、配列ではできません。実際、配列要素を読み取り専用にできないことは、データが外部から変更される可能性がある状況で配列を使用する場合の大きな欠点です。

配列の要素を保護する唯一の方法は、変更を実行する前に要素とインデックスをチェックするクラスに配列をカプセル化することです。

public class ArrayWithFixedFirst {
    private final Integer[] numbers = new Integer[11];
    public Integer get(int index) {
        return numbers[index];
    }
    public void set(int index, Integer value) {
        if (index == 0) throw new IllegalArgumentException();
        numbers[index] = value;
    }
}
于 2013-02-14T21:21:04.117 に答える
2

配列の最初の要素を再割り当てできないように指定する方法があるとは思いません。

最善の策は、配列のラッパー クラスを作成し、最初の要素を再割り当てしようとする試みを無視することだと思います。

于 2013-02-14T21:22:03.643 に答える
1

カプセル化により、配列の変更を許可/禁止できます。

public void updateArray(int position,int value){

if(position > 0 && position < numbers.length){

    numbers[position] = value;

    }
}
于 2013-02-14T21:25:46.457 に答える
0

配列を変更不可にすることはできません。代替手段は を使用してCollections.unmodifiableListいます。ただし、リスト全体は変更できません。

于 2013-02-14T21:21:57.297 に答える
0

興味深い質問ですが、ノーと言わざるを得ません。Java 配列では、1 つの要素だけをファイナライズすることはできません。カスタム ラッパーを作成することで同じ機能を実現できる可能性がありますが、その理由について疑問が生じます。あなたがどのようなアプリケーションを目指しているのかわかりませんが、10 要素の配列をラップし、インデックスを 1 減らし、0 番目のインデックスに対して null を返すことをお勧めします。

于 2013-02-14T21:22:59.360 に答える
0

なぜそんなことをするのかわかりませんが、次のようなものです。

class NoFirstArray extends ArrayList {
    public NoFirstArray(int size,Object initialValue) {
       super(size);
       super.set(0,initialValue);
    }
    public void set(Integer i, Object value) {
        if(i == 0) throw RuntimeException();
        super.set(i,value);
    }
    public void remove(int i) {
        if(i == 0) throw RuntimeException();
        super.remove(i);
    }
}
于 2013-02-14T21:23:11.667 に答える