2 Stimmen

Gute Software-Praxis - Get- und Set-Methoden

Wie Sie sehen können, deklariert die Klasse unten 2 private Instanzvariablen und 2 Get- und 2 Set-Methoden, die mit jedem privaten Mitglied verbunden sind, um die Manipulation und Validierung dieser Variablen zu ermöglichen.

Meine Frage ist: was ist besser, in der Konstruktor-Verzögerung, die Instanz-Variablen direkt wie im Schnipsel unten gezeigt oder die Set-Methoden mit Ihnen verbunden zu verwenden und auch die gute Software-Praktiken in der toString-Methode, die Instanz-Variablen oder deren Getter-Methoden zu verwenden gefördert wird?

Ich danke Ihnen für Ihre Zeit.

public Class Employee {

  private String firstName;
  private String lastName;

  public Employee (String first, String last)
  {
    firstName = first;
    lastName = last;
  }//end of constructor

  public void setFirstName(String first)
  {
    firstName = first;
  }//end of method setFirstName

  public String getFirstName()
  {
    return firstName;
  }

  public void setLastName(String last)
  {
    lastName = last;
  }//end of method setLastName

  public String getLastName()
  {
    return lastName;
  }//end of method getLastName

  public String toString()
  {
    return String.format ("%s: %s %s\n", "Employee Name: ", firstName, lastName);
  }//end of method toString

}//end of class Employee

5voto

Brian Agnew Punkte 260470

Ich neige dazu, die Initialisierung über die Konstruktion zu bevorzugen. Durch die Verwendung dieser Methode und die Bereitstellung geeigneter Prüfungen (Kompilierungszeit über final und zur Laufzeit über Nullchecks o.ä.) können Sie sicherstellen, dass Ihr Objekt korrekt und vollständig instanziiert.

Die Verwendung des final Schlüsselwort für Ihre Felder lässt den Compiler prüfen, ob Sie diesem Feld bei der Erstellung einen Wert zugewiesen haben. Es bedeutet zwar, dass das Feld unveränderlich ist, aber es ist überraschend, wie oft man das benötigt.

Ich würde vorsichtig sein mit der Bereitstellung von Gettern für alles. Wenn Sie ständig Getter bereitstellen und verwenden, deutet das darauf hin, dass Sie Daten aus Ihrem Objekt herausziehen und sie außerhalb dieses Objekts manipulieren. Denken Sie daran - ein Schlüsselprinzip von OO ist Objekte dazu bringen, Dinge für einen zu tun anstatt sie um Daten zu bitten und sie selbst zu erstellen.

2voto

scibuff Punkte 13013

Regel Nr. 1: Beschränken Sie den Zugriff immer auf das Nötigste, d. h. wenn Sie nicht ausdrücklich die Werte des ersten/letzten Namens ändern müssen, machen Sie das Objekt unveränderlich (Konstruktor mit Parametern, keine Setter, nur Getter)

1voto

Attila Punkte 27065

Wenn Sie erwarten, dass Ihre Klasse erweitert wird (und die Getter/Setter überschrieben werden), ist es am besten, die Methoden anstelle der Variablen zu verwenden.

HINWEIS: Ich bin mir nicht sicher, was genau im Konstruktor passiert, Sie sind wahrscheinlich besser dran, wenn Sie die Variable direkt setzen.

Sie können den Getter/Setter als endgültig markieren und müssen sich dann nicht mehr um Überschreibungen kümmern. Dennoch ist es eine gute Praxis, diese Methoden anstelle des direkten Zugriffs zu verwenden, da Sie dort leichter Haltepunkte oder Debug-Anweisungen setzen können

1voto

claesv Punkte 2077

Im Allgemeinen vermeide ich es, nicht-statische Methoden aus dem Konstruktor heraus aufzurufen (da das Objekt in diesem Stadium noch nicht vollständig initialisiert ist). Wenn die Setter-Methoden nur ein Feld auf den Parameterwert setzen, wie oben, würde ich es einfach im Konstruktor setzen (d.h. den Setter nicht aufrufen). Wenn der Setter komplexer ist, würde ich versuchen, die Logik in eine statische Hilfsmethode auszulagern und sie sowohl im Konstruktor als auch in den Setter-Methoden zu verwenden. Etwas wie:

 int field_;     

 Constructor(int initialValue) {
     field_ = helper(initialValue);
 }

 public void setField(int value) {
     field_ = helper(value);
 }

 // not really complex, but avoid duplication of logic
 private static int helper(int value) {
     return 2*value;
 }

0voto

Yazan Al-Alul Punkte 472

Ich würde den Setzer verwenden. Manchmal haben Sie zusätzlichen Code in den Settern. Zum Beispiel könnte der Setter für eine Liste auch das Changed-Ereignis der Liste haken, und indem Sie den Setter nicht verwenden, werden Sie das Changed-Ereignis nicht erfassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X