2016-03-31 6 views
1

配列の値を変更する関数を作成したいが、関数に配列を渡したくない。コードの一部は別の関数で作成されたdata[] arrayです。Javaメソッドの配列値をメソッドに渡さずに変更する

private int[] data; 

public static void main(String[] args) { 
    setPixel(3,2); //I'm not sure at this part? 
} 

public void setPixel(int i,int x){ 
    data[i] = x; //Is there any possible way to change data[] 
} 

答えて

2

あなたのmain方法を中心にクラスを作成し、main以内にそれをインスタンス化する必要があります。 dataをクラスの変数にして、setPixel()メソッド内からアクセスできます。これは、あなたが求めていることを達成するための適切なオブジェクト指向(OO)の方法です。

public class Data { 
    private int[] data; 

    public Data(int size) { 
     data = new int[size]; 
    } 

    public void setPixel(int i, int x) { 
     data[i] = x; 
    } 

    public static void main(String[] args) { 
     Data instance = new Data(5); 
     instance.setPixel(3, 2); 
    } 
} 
0

ここでかなりの提供@zpostenもののようである私の答え、ですが、また、OPのdata[] array created at another function要件のアドレス:

public class EncapsulatedArray 
{ 
    private final int[] data; 

    public EncapsulatedArray(final int[] data) 
    { 
     this.data = data; 
    } 

    public int getPixel(final int i) 
    { 
     return data[i]; 
    } 

    public void setPixel(final int i, final int x) 
    { 
     data[i] = x; 
    } 

    @Override 
    public String toString() 
    { 
     return Arrays.toString(data); 
    } 
} 

検証し、実証するために、私が使用:

public class EncapsulatedArrayDemo 
{ 
    public static void main(final String[] args) 
    { 
     final int[] dataFromElsewhere = { 0, 1, 2, 3 }; 

     final EncapsulatedArray ex = new EncapsulatedArray(dataFromElsewhere); 

     System.out.println(ex); 

     ex.setPixel(2, 7 + ex.getPixel(2)); 

     System.out.println(ex); 
    } 
} 

を入手し、コンソールに以下を取得しました。

{ 0, 1, 2, 3 } 
{ 0, 1, 9, 3 } 

この(おもちゃ)のようなラッパークラスが便利な理由はいくつかありますが、データ配列を外部の変更(つまり、変更)から「保護する」ことを望むのであれば、さまざまな理由があります。 setPixel(int, int)だけがdataの値を変更することが許可されていれば、dataの配列オブジェクトをラッパーから逃げることはできません@ zpostenの答えのようなものが必要になります。データ配列created at another functionを使用する必要がある場合は、私の解決策のようなものが必要ですが、配列がラッパーの背後で手抜きされないようにするためには、別の手順を踏む必要があります。

関連する問題