2016-08-08 10 views
3

Warum würden Sie eine static final Variable als private für einen unveränderlichen Typ deklarieren?Gründe für die Deklaration einer privaten statischen endgültigen Variablen

Konnte es irgendeinen Schaden verursachen, sie zu erklären public auf jeden Fall?

+5

Nur weil das Feld final ist, bedeutet das nicht, dass das Objekt, auf das es verweist, unveränderlich ist. Daher müssen Sie es möglicherweise noch einkapseln. – Andreas

+1

Logger ist ein gutes Beispiel, siehe http://stackoverflow.com/questions/26241787/declaring-variable-final-and-static?rq=1 –

+2

Oder einfach alles, was nicht offen gelegt werden muss, um die API klein zu halten . –

Antwort

3

Damit niemand von außen darauf zugreifen und sich auf diesen Wert verlassen kann, gibt es die Freiheit, ohne Nebenwirkung (zumindest außerhalb der Klasse, in der es deklariert ist) zu ändern.

+0

Diese Antwort ist unvollständig. @ A4L gibt eine viel umfassendere Antwort. –

0

Es ist nur beste OOP-Praxis, Variablen im richtigen Umfang zu halten. Ein Beispiel wäre eine globale statische letzte Ganzzahl zum Ausführen einer Anzahl von Berechnungen innerhalb der Klasse. Wenn sie öffentlich gemacht werden, kann dies nicht nur zu Problemen führen, sondern auch zu Verwirrung.

Sagen Sie bitte eine Klasse haben, wo man den Wert von pi muß wissen:

public class MyClass { 
    private static final double PI = 3.14159; 

    //functions performing calculations with value of PI 
} 

Der Wert von Pi nur innerhalb MyClass benötigt wird, es so zu verlassen machen keinen Sinn, ausgesetzt werden - alle Berechnungen mit der Variable sind innerhalb MyClass getan. Wenn Sie es erneut benötigen, um eine Berechnung durchzuführen, sollte dies innerhalb der Klasse erfolgen, die den Wert enthält, damit Ihr Code organisiert bleibt.

+0

_Das Offenlegen (öffentlich) könnte nicht nur Probleme verursachen, sondern auch Verwirrung._ Bitte gehen Sie dabei näher darauf ein. Es ist der interessante Teil der Antwort. –

+0

@StiriosDelimanolis Sicher Sache! Ich wusste nicht, dass ich mehr ins Detail gehen musste, aber ich würde mich freuen. –

3

Es gibt mehrere Gründe ...

Datenschutz

Implementierungsdetails Halten von den Clients verborgen, zB Konstanten für den internen Gebrauch und ohne Einsatz für Kunden

Sicherheit

Schützen Sie Ihren Code vor bösartigen Client-Codes zum Beispiel:

static class A 
{ 
    public final static List<String> list = buildList(); 

    public static List<String> buildList() 
    { 
     ArrayList<String> list = new ArrayList<>(); 
     list.addAll(Arrays.asList("A", "B", "C")); 
     return list; 
    } 
} 

static class B 
{ 
    public static void main(String[] args) 
    { 
     A.list.clear(); 
     System.out.println(A.list); 
    } 
} 

Sie möchten nicht, dass jemand Ihre internen Daten manipuliert.

+0

Ich denke, dass Ihr Beispiel nicht mit Ihrer Antwort übereinstimmt. 'list' ist nicht wirklich geschützt und kann geändert werden. Sie können es verhindern, wenn die Build-Liste 'Collections.unmodiableList (Arrays.asList (" A "," B "," C ")) zurückgibt;' – user902383

+0

@ user902383 das ist, wofür das Beispiel war, dh um zu zeigen, dass es nicht ist geschützt, da die Frage über den Punkt der "privaten statischen endgültigen" war, wenn die Liste öffentlich oder geschützt war, dann sollte sie definitiv mit einer nicht änderbaren Sammlung geschützt werden, genau wie Sie in Ihrem Kommentar oder einer Kopie gezeigt haben. – A4L

+0

spielt keine Rolle, welche Schlüsselwörter Sie in der Deklaration Ihrer Liste verwenden, wenn die Implementierung 'ArrayList' ist, wird der Inhalt möglicherweise geändert. – user902383

-2

Der statische Modifikator wird in Kombination mit dem letzten Modifikator auch zum Definieren von Konstanten verwendet. Der letzte Modifikator gibt an, dass der Wert dieses Felds nicht geändert werden kann.

https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Wenn Sie die statische endgültige Variable mit öffentlichen erklären, wird die Variable der Lage sein Standort seiner Klasse zu sehen, aus. Es kann einen möglichen Fehler zur Kompilierzeit verursachen, wenn jemand versucht, seinen Wert in anderen Klassen zu ändern.

Wenn Sie die statische endgültige Variable mit privat deklarieren, ist sie in anderen Klassen verborgen. So können Sie einen solchen Fehler vermeiden.

Verwandte Themen