2016-04-15 11 views
0

Während der Arbeit in IntelliJ wurde mir empfohlen, eine Methode zu lokalisieren - indem Sie den Zugriffsmodifikator entfernen. Mir wurde klar, dass ich nicht wirklich weiß, welcher Modifikator verwendet werden sollte und wann und ob ich etwas Klärung wünschte.Wann muss ein lokaler Zugriffsmodifikator verwendet werden?

las ich diesen Beitrag: What is the difference between Public, Private, Protected, and Nothing?

und wie die für C# ist, obwohl sie ähnlich sind, wollte ich sicherstellen, dass es nicht viel anders ist.

Ich las auch die Javadoc Post hier: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

und war immer noch ein bisschen skeptisch.

Vielen Dank im Voraus!

+1

Verwenden Sie privat, wo immer es möglich ist. Verwenden Sie protected nur, wenn Sie explizit für die Vererbung entwerfen. Nothing (Paket) ermöglicht anderen Klassen im selben Paket, die Methode aufzurufen, aber keine Klassen in einem anderen Paket. Die Öffentlichkeit erlaubt natürlich jedem, sich darauf zu berufen. Verwenden Sie die Öffentlichkeit sparsam. – KevinO

+0

@neferpitou das ist wirklich nur eine Kopie des Diagramms unter [link] (https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html). Ich war neugierig, ob es einen besseren Weg gibt, es zu erklären. – primelf

+0

Danke, @KevinO das half mir bei der Klärung. Bedeutet dies, dass eine öffentliche Methode leicht aus der Hauptklasse oder einer anderen Klasse geändert werden kann? – primelf

Antwort

3

Zugriffsmodifikatoren helfen beim OOP-Prinzip der Kapselung. Wenn Sie eine gut geschriebene Klasse erstellen, können Sie sie verwenden, ohne alle internen Details zu kennen. Wenn Sie eine Methode als public definieren, hat jeder Code, der Ihre Klasse verwendet, Zugriff auf diese Methode. Sie wollen nur Methoden offenlegen, die der Endbenutzer Ihrer Klasse benötigt. Wenn es sich um eine Hilfsmethode handelt, die einige interne Berechnungen nur in Ihrer Klasse durchführt, deklarieren Sie sie als privat. Es wird die für den Endbenutzer verfügbaren Methoden einsparen und Ihre Klasse viel einfacher zu benutzen machen. Hier ein Beispiel:

Public Class Car { 
    private int speed; 
    private float fuelNeeded; 
    private float afRatio = 14.7; 

    public void speedUp { speed++; } 

    public void speedDown { speed--; } 

    public float getFuelNeeded { 
     calculateFuelNeeded(speed); 
     return fuelNeeded; 
    } 

    private void calculateFuelNeeded (int speed) { 
     // Do some complex calculation 
     fuelNeeded = someValue/afRatio; 
    } 
} 

Wer ein Car-Objekt erstellt drei Methoden zur Verfügung haben wird, SpeedUp, speedDown und getFuelNeeded. calculateFuelNeeded wird nur intern von der Klasse verwendet, daher gibt es für den Benutzer keinen Grund, sie zu sehen. Auf diese Weise müssen sie nicht wissen, wie der Betrag berechnet wird oder wann die Methode aufgerufen werden muss oder welche Werte intern festgelegt werden. Sie erhalten einfach den Wert mit getFuelNeeded();

Bei der Deklaration von Variablen ist es normalerweise immer korrekt, sie als privat zu deklarieren, da sie eine öffentliche Methode get() und set() für alle enthält, auf die von außerhalb der Klasse zugegriffen werden muss. Der Hauptgrund dafür besteht darin, zu verhindern, dass ein externer Benutzer den Wert als ungültig einstuft. In unserer Car-Klasse muss afRatio ungleich null sein, da wir es als Teiler verwenden. Wenn wir es als öffentlich erklären, könnte ein Benutzer leicht diesen Code schreiben:

Car car = new Car(); 
car.afRatio = 0; 
someFloat = car.getFuelNeeded(); 

Natürlich ist dies unsere Klasse eine ArithmeticException für Divison werfen durch Null verursachen würde. wenn wir dies jedoch taten

private afRatio = 14.7; 

public void setAfRatio(float ratio) { 
    if(ratio <= 0) 
     throw new IllegalArgumentException("A/F ratio must be greater than zero"); 
    afRatio = ratio; 
} 

Dies ermöglicht es uns Benutzer angegebene Parameter zu überprüfen und unsere Variablen nicht sicherstellen zu einem gewissen ungültigen Wert gesetzt bekommen.

Verwandte Themen