2016-03-26 12 views
1

Wenn ich etwas tun, wieGibt es eine Möglichkeit, ein Array in Java wirklich privat zu machen?

private int[] myPrivateArray; 

und haben einen Getter, die das Array zurückgibt, dann kann der Inhalt des Arrays von außerhalb der Klasse geändert werden, die Art von Niederlagen der Zweck es privat machen.

+1

wenn Sie nicht wollen, um den Inhalt von außen Rückkehr Kopie Ihres privaten Array-Objekts ändern. Verwenden Sie entsprechend das tiefe Klonen oder das flache Klonen. – Vishrant

+3

"Wenn ich ... habe einen Getter, der das Array zurückgibt" - * Warum hast du das *? Sie brauchen keinen Getter für alles. – user2357112

+1

Defensive Kopien? Genauso wie jeder änderbare Zustand - wenn Sie ihn nicht offen legen wollen, müssen Sie Kopien oder unveränderliche Objekte zurückgeben. –

Antwort

3

Sie können Setter, Getter für die spezifischen Indexelemente des Arrays bereitstellen, ähnlich wie bei List-Implementierungen. Um es von einer Funktion zurückzugeben, können Sie das Array kopieren und stattdessen die Kopie übergeben. Anstatt den Verweis auf Ihr Array zu übergeben, übergeben Sie den Verweis auf eine Kopie Ihres Arrays.

4

Ja, gibt es.

Erstens, stellen Sie keinen Getter für dieses Array, wenn Sie nicht müssen. Wenn Sie einen Getter bereitstellen müssen, übergeben Sie eine Kopie, nicht die private Variable.

Zweitens (was bisher übersehen wurde), stellen Sie sicher, dass die JVM SecurityManager zum Stoppen reflection eingerichtet ist.

2

Wie andere gesagt haben, können Sie eine Kopie des Arrays zurückgeben kann:

public int[]getMyArray(){ 
    return myPrivateArray.clone(); 
} 

Alternativ können Sie einen Getter bieten einzelne Elemente des Arrays zuzugreifen:

public int getMyArray(int index){ 
    return myPrivateArray.get(index); 
} 

Wenn schließlich Wenn Sie das Kopieren vermeiden möchten, aber darauf bestehen, alle Elemente auf einmal zurückzugeben, können Sie eine nicht änderbare Listenansicht Ihres Arrays zurückgeben:

public class MyClass{ 
    private Object[]myPrivateArray; 

    private List<Object>myArrayView=Collections.unmodifiableList(Arrays.asList(myPrivateArray)); 

    public List<Object>getMyArrayView(){ 
     return myArrayView; 
    } 
} 

Das ist zwar etwas komplizierter, mit einer Reihe von Grundelementen:

public class MyClass{ 
    private int[]myPrivateArray; 

    private List<Integer>myArrayView=new AbstractList<Integer>(){ 
     @Override public int size(){ 
      return myPrivateArray.length; 
     } 
     @Override public Integer get(int index){ 
      return myPrivateArray[index] 
     } 
    } 
    public List<Integer>getMyArrayView(){ 
     return myArrayView; 
    } 
}