tj: Get Set Methoden

Hi,

Ich habe im Forumarchiv nichts dazu gefunden: wer kann mir erklären für was genau get und set methoden sinnvoll sind? Das sind doch eigentlich ständige redundanzen?

Danke für eure hilfe,
Ein java-anfänger

Tj

  1. Hallo,

    im Normalfall will man vermeiden, dass man direkt auf die Eigenschaften einer Klasse zugreift, um von der internen Arbeitsweise der Klasse zu abstrahieren.

    Die Eigenschaft könnte von anderen Werten abhängen und die Klasse kann nicht darauf reagieren, wenn du die Eigenschaft von außen änderst. Dadurch können die Eigenschaften unter Umständen sinnlose Werte enthalten, die sich widersprechen. Auch wäre es der Klasse z.B. nicht möglich einen Wert erst aus der DB lesen, wenn er gebraucht wird.

    Außerdem lässt sich über Methoden auch leichter ein Rückkompatibilität bewerkstelligen, indem ehemalige einfache Getter, dass frühere Verhalten simulieren und die neuem Methoden aufrufen. Rufen erst einmal Scripte Eigenschaften direkt auf wird es sehr schwierig an der Klasse etwas zu ändern.

    Häufig machen Getter und Setter aber auch nichts anderes als die Eigenschaften auszulesen und zu setzen, was zunächst sinnlos ist. Jedoch geben sie dir die Möglichkeit später beim Auslesen oder setzen von Eigenschaften anderen Code mitauszuführen oder eine Validierung vorzunehmen.

    Einige sprachen bieten auch Möglichkeiten an, um Getter/Setter automatisch zu erstellen, sodass man die Methoden nur dann manuell deklarieren muss, wenn man mehr machen möchte als eine Eigenschaft zu setzten oder zu lesen.

    Viele Grüße Novi

    --
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)
  2. Hi!

    wer kann mir erklären für was genau get und set methoden sinnvoll sind? Das sind doch eigentlich ständige redundanzen?

    Ergänzend zu Novis Antwort: Ein Problem ist auch, dass der Zugriff auf Eigenschaften syntaktisch wie ein Variablenzugriff zu notieren ist, ein Zugriff auf einen Getter/Setter jedoch ein Funktionsaufruf ist. Wenn du irgendwann einmal mehr als einen reinen Zugriff haben möchtest, musst du alle Verwendungen umschreiben. Wenn deine Bibliothek, in der die Änderung notwendig wird, sehr oft in Verwendung ist, hast du einen sehr hohen Änderungsaufwand. Auch deswegen nimmt man lieber von vorn herein die erst einmal redundant scheinenden simplen Setter und Getter.

    C# hat die Gnade der späteren Geburt genutzt (oder den besseren Designer gehabt), und bietet ebenfalls einfache Eigenschaften, genannt Fields, die lediglich Werte aufnehmen können. Doch auch der C#-Designer wusste, dass Getter und Setter sehr nützliche Dinge sind. Nur hat er nicht wie bei Java eine Benennungskonvention eingeführt, sondern als syntaktischen Zucker die Propertys implementiert. Hm? Property heißt doch Eigenschaft, wo ist da der Unterschied zu den Eigenschaften namens Field? C#-Propertys verhalten sich nach außen hin wie einfache Eigenschaften. Lesen und Schreiben erfolgt durch Lesezugriffe und Zuweisungen, nicht durch Funktionsaufrufe. Aber der C#-Compiler erstellt daraus implizit Funktionen. Es folgt ein Beispiel mit einfachem Zuweisen und Auslesen:

    private foo; // ein field
      public Foo { // eine property
        get { return foo; } // einfacher getter
        set { foo = value; } // einfacher setter
      }

    Angewendet sieht das so aus:

    var x = Foo; // lesend
      Foo = x; // schreibend

    Solche einfachen Getter/Setter kann man mittlerweile auch sehr kurz notieren:

    public Foo { get; set; }

    Der Compiler macht den Rest (privates Field anlegen und Zugriffsmethoden erstellen), der Programmierer muss sich nicht damit rumschlagen. (Bei Java macht es die IDE und man hat jede Menge wenig interessantes Zeug im Quelltext.) Er kann aber sehr einfach bei Bedarf Getter und/oder Setter um weitere Logik ergänzen, ohne dass dabei die an anderern Stellen notierten Verwendungen geändert werden müssen oder anderswie etwas davon mitbekommen.

    Willst du nicht auf C# umsteigen? :-) Hier ist alles irgendwie schöner als bei Java, finde ich.

    Lo!

    1. Yerf!

      Willst du nicht auf C# umsteigen? :-) Hier ist alles irgendwie schöner als bei Java, finde ich.

      Naja, nicht alles. Auch wenn manche drüber Fluchen, die Java-Eigenheit, das man geworfene Exceptions deklariren muss halte ich für sehr sinnvoll.

      Und das man in C# die Structs nicht entsorgt hat... ich hasse die Teile. Sehen aus wie Objekte, verhalten sich aber komplett anders. Vor allem Lustig, wenn man im Web unterwegs ist und sich mit den Unterschieden vom Date-Objekt in JS und dem DateTime Struct in C# rumschlagen muss... danke!

      Könnt ich nicht ne Sprache bekommen, die nur die Vorteile aller vereint?

      Gruß,

      Harlequin

      --
      RIP --- XHTML 2
      nur die Besten sterben jung
  3. Hallo,

    nur als Ergänzung: Auch in Java muss man die Getter und Setter nicht mehr selbst schreiben. Es gibt eine nette Bibliothek die einem das mit Hilfe einiger Annotationen abnimmt: http://www.projectlombok.org/.

    Auch equals, hashCode und toString werde von Lombok automatisch erzeugt. Spart eine ganze Menge Tipparbeit.

    Beste Grüße

    Stareagle