2017-02-16 4 views
2

So sagte mein Dozent etwas entlang der Linien von:Welche Wartungsprobleme mit geschützten Variablen in Java verbunden sind

Deklarieren von Variablen wie setzt sie alle Subklassen geschützt, kann ein Wartungsprobleme verursachen, beste Variablen zu erklären, wie private (auch in Vererbungsbeziehungen) und schreiben Getter und Setter Methoden, um den Zugriff auf Variablen bereitzustellen.

Aber er erklärte nicht, was die Wartungsprobleme waren. Welche Probleme gibt es, wenn Unterklassen auf Variablen zugreifen können?

Im ziemlich neu in Java, so dass eine vereinfachte Erklärung wäre hilfreicher

Antwort

5

Angenommen, Sie eine Klasse mit einer protected Instanz-Variable schreiben:

public class A { 
    protected int c; 
} 

Nun kann jemand anderes erweitert Klasse und verwenden Sie die c Variable direkt:

public class B extends A { 
    public void someMethod() { 
     System.out.println(c + 5); 
    } 
} 

Jetzt hängt B auf der c Mitglied Ihrer Klasse A. Wenn Sie sich morgen entschließen, diese Variable zu entfernen oder sie umzubenennen oder ihren Typ zu ändern, wird B die Kompilierung nicht bestehen.

Wenn Sie c privat machen und einen Getter und einen Setter bereitstellen, um darauf zuzugreifen, haben Sie die Freiheit, c zu ändern, ohne Klassen zu brechen, die Ihre Klasse erweitern.

+0

"Wenn ... Sie sich entscheiden, diese Variable zu entfernen oder sie umzubenennen oder ihren Typ zu ändern" Aber das ist auch ein Problem mit Gettern: Sie können diese Dinge auch nicht mit Methoden machen. –

+0

(Ich kann hier "Typ" falsch lesen - ich vermute, Sie könnten "Darstellung" bedeuten) –

+1

@AndyTurner Das stimmt, aber Sie könnten die interne Implementierung von Methoden ändern, die die Instanzvariablen verwenden, ohne Code zu brechen, der diese Methoden aufruft. Beispielsweise kann eine Getter-Methode den Wert einer privaten Instanzvariable zurückgeben, und später können Sie entscheiden, dass die Variable eliminiert werden kann. Die Getter-Methode gibt dann einen Wert zurück, der auf anderen Variablen basiert. – Eran

1

Mit Getter- und Setter-Methoden können Sie steuern, was passiert, wenn das Element geändert oder zugegriffen wird. Wenn Sie zum Beispiel die Wartungsaufgabe erhalten, einige Prüfungen durchzuführen, bevor das Mitglied geändert wird, können Sie dies leicht tun, wenn Sie Ihre Klasse mit einer Setter-Methode entworfen haben. Wenn das Mitglied jedoch nur geschützt ist, müssten Sie innerhalb aller Unterklassen nach dem Ort suchen, an dem es geändert wird. Ihre Wartungsaufgabe würde das Refactoring der Unterklassen beinhalten, anstatt nur Änderungen an der Setter-Methode vorzunehmen.

1

Auschecken Effektive Java 2nd Ed Eintrag 14: "Verwenden Sie in öffentlichen Klassen Accessormethoden, keine öffentlichen Felder".

Hier geht es um einen etwas anderen Fall (öffentliche Felder anstelle von geschützten Feldern), aber es gibt eine gute Beschreibung, warum das Aussetzen von Feldern außerhalb der Klasse generell zu vermeiden ist. In gewisser Weise sind geschützte Felder wie öffentliche Felder, da sie außerhalb der Klasse von jeder Unterklasse zugänglich sind.

Die besonders relevant Zitat ist:

Sie können die Darstellung ändern ohne die API zu ändern, können Sie nicht Invarianten durchsetzen können, und Sie können Hilfs Maßnahmen ergreifen, wenn ein Feld zugegriffen wird .

Mit anderen Worten, wenn Sie das Feld Subklassen ausgesetzt haben, sind Sie dann verpflichtet das Feld als Feld für immer nach dem Erhalt, es sei denn, Sie alle Unterklassen aktualisieren können (was fast Sie sicher kann nicht, es sei denn, Sie arbeiten in einer geschlossenen Umgebung).

Verwandte Themen