Java - Best Practice für Getter, Single Getter oder Multiple für verschiedene Variablen?

8

Ich bin relativ neu in der Android-Programmierung (~ 2 Monate) Ist es notwendig, Getter für Dutzende von verschiedenen Variablen zu haben?

Zum Beispiel -

%Vor%

Während es zum Beispiel notwendig wäre, verschiedene Getter und Setter für Floats und Strings zu haben, ist es eine schlechte Übung, und wenn ja, warum sollte es so etwas wie eine switch-Anweisung geben, um verschiedene Variablen zurückzugeben?

%Vor%

Also, wird der obige Code als schlecht angesehen? Wenn ja, bitte erläutern Sie warum.

Danke für jede Hilfe, das ist nicht wirklich ein Problem, da jeder Weg gut funktioniert, ich sehe einfach nicht, warum Leute Dutzende von Getter und Setter verwenden würden, wenn es keinen guten Grund gibt.

Ich nehme an, die gleiche Frage gilt für Setter

    
Theo Pearson-Bray 20.07.2015, 13:28
quelle

7 Antworten

9

Weil du etwas wie

machst %Vor%

Ich kann die nächste Frage für Stack Overflow fühlen, "Warum ist meine Höhe immer 0?"

Und dann Postleitzahl wie

%Vor%

Technisch gesehen haben Sie in dem Moment, in dem Sie einen Tippfehler machen, Probleme, die Ursache des Problems zu finden. Das, und du hast Glück, dass die Felder alle float sind, müssen sie nicht sein.

Bearbeiten: Dies ist übrigens ein typisches Problem bei der Definition des Interessensbereichs in einigen Datenbankabfragen. Wie in, indem Sie das gesuchte Feld mit String angeben.

Ein konkretes Beispiel ist RealmQuery<T> .

A RealmQuery<T> sieht so aus:

%Vor%

Wo sie annehmen, dass die Klasse User etwa so ist:

%Vor%

Eine interessante Bemerkung ist, dass Realm eine "Proxy-Unterklasse" erstellt, in der sie die Methoden setName und getName neu definieren (man braucht Getter / Setter, damit einige Systeme funktionieren! Sie nehmen an, dass Sie sie haben!)

Aber wichtig ist hier, dass Sie den Feldnamen mit "name" angeben müssen.

Später kann jeder einen Tippfehler machen oder Sie werden sich nicht an die Felder erinnern. In diesem speziellen Fall neigen sie dazu, ein Metamodell (etwas, das den Namen der Felder für Sie speichert) zu dem Zweck zu erstellen, zu dem Sie keine Strings verwenden müssen beziehen Sie sich auf Feldnamen.

Zum Beispiel in der Kriterien-API anstelle von

%Vor%

Sie haben das Metamodell so:

%Vor%

Somit wird String s überflüssig.

Und ähnlich mache ich es mit Realm, dass ich ein "Metamodell" erstelle (obwohl du es jetzt automatisch mit RealmFieldNamesHelper ):

%Vor%

Und so können Sie die Abfrage wie folgt ersetzen

%Vor%

Aber mit Getter und Setter haben Sie bereits den Typ Sicherheit, und Sie haben bereits die Methoden, die Sie nicht aus dem Kopf behalten müssen - und so haben Sie die Kompilierzeit Fehlerprüfungen.

Um Ihre Frage zu beantworten, ist der Grund, warum es eine schlechte Übung ist, in Java auf Variablen nach Zeichenkettennamen zu verweisen,

1.) Tippfehler können auftreten, und der Fehler tritt nur in runtime auf, nicht in der Kompilierzeit

2.) es ist nicht typsicher ; Du hast Glück, dass du float s zurückbekommst, egal was in diesem Beispiel ist, aber wenn es ein String sein kann, musst du Object zurückgeben und es benutzen oder public <T> T get(String field) { ... } benutzen und wer auch immer die Methode aufrufen muss wissen genau, was sie erhalten - auch Laufzeitfehler anfällig.

    
EpicPandaForce 20.07.2015, 13:39
quelle
3

Getters & amp; Setzer geben Ihnen Typsicherheit. Verwenden Sie es jedoch nur für Variablen, auf die Sie von außerhalb der Klasse zugreifen (setzen / setzen) müssen. Sie können und sollten es minimieren, indem Sie geeignete Konstruktoren verwenden, was in den meisten Fällen der richtige Weg ist, da es die Klarheit des Codes durch Eliminieren magischer Änderungen im Hintergrund erhöht, was für Multi-Thread-Code ein schwerer Schmerz sein kann ein großes Problem, sogar in normalen Code mit schlechter Programmierung.

Nur weil Sie zwanzig private Variablen auf Klassenebene haben, bedeutet das nicht, dass Sie getXXX () & amp; setXXX () für jeden!

Übrigens: Die meisten IDEs heutzutage wie Eclipse können sie automatisch für Sie generieren.

    
Angsuman Chakraborty 20.07.2015 13:46
quelle
2

Erstellen Sie einfach Getter und Setter, wenn Sie sie brauchen.

%Vor%

Wenn Sie area = returnSomething("width") * returnSomething("heigth") versuchen, werden Sie immer mit 0 Bereich enden. Beachten Sie den Schreibfehler. Wenn Sie separate Methoden haben, sagt der Compiler dies zur Kompilierzeit.

Außerdem müssen Sie viele Prüfungen durchführen, wenn Sie viele Variablen haben.

    
Viktor Mellgren 20.07.2015 13:41
quelle
2

Ich bin auch kein Freund von Getters / Setter, aber sie sind wahrscheinlich die beste Lösung hier. Die IDE wird Code-Generierung für solche Felder bereitstellen.

Grund: felsenfest, nicht fehleranfällig, einfacher für spätere Änderungen.

Machen Sie nur Getter / Setter, wenn sie wirklich benötigt werden. A public void move(float, float) und andere interessantere Methoden können die Koordinatenberechnung weitgehend in die Klasse selbst einfügen.

    
Joop Eggen 20.07.2015 13:48
quelle
1

Sie müssen nur Getter und Setter für die Variablen angeben, die Sie verwenden oder aktualisieren müssen.

Ich denke, es ist nur eine Angewohnheit, Ihre Rückkehr. Etwas wird gut funktionieren, aber es ist einfacher zu rufen und zu verstehen:

%Vor%

als

%Vor%     
Gerard Reches 20.07.2015 13:33
quelle
1

Interessantes Thema. Ich fühle, dass es eine dritte Antwort gibt. Es gibt ein Argument, das sagt, dass Getters und Setters böse sind und du solltest es vermeiden, sie überhaupt zu benutzen. Weil Sie im Wesentlichen Mitglieder als private deklarieren, aber öffentlichen Änderungszugriff durch Getter und Setter gewähren.

Vergleichen wir die beiden. Hier ist eine Personenklasse, die getters und setters verwendet

%Vor%

Verwendung dieser Klasse:

%Vor%

Lassen Sie uns jetzt die gleiche Klasse erstellen, ohne Getter und Setter zu verwenden.

%Vor%

und Zugriff wird sein:

%Vor%

Wie Sie sehen können, bringt das Getter- und Setter-Muster eine ganze Menge zusätzlicher Schreibweise. Es gibt jedoch viele Vorteile zur Verwendung von Getter und Setter.

Das ganze Argument gegen die Verwendung von Getter und Setter in einer objektorientierten Sprache kann wie folgt zusammengefasst werden:

  

Verfahrenscode erhält Informationen und trifft dann Entscheidungen. Objektorientierte   Code sagt Objekten Dinge zu tun. - Alec Sharp

Sagen wir als einfaches Beispiel, dass wir die Informationen von Person in die Datenbank schreiben wollen. Einige Entwickler neigen dazu, eine Datenbankschnittstelle zu erstellen, die eine Funktion

hat %Vor%

verwendet Getter und Setter, um die erforderlichen Daten in die Datenbank zu schreiben.

Laut den Getter- und Setter-Nay-Sagern sollte Person selbst dafür verantwortlich sein, die Datenbank selbst zu schreiben.

%Vor%

Um Ihre Frage zu beantworten, verwende ich lieber Getter und Setter als Ihren zweiten Vorschlag, da Sie schließlich für jede Eigenschaft eine Reihe von Konstanten oder Enums hinzufügen werden. Dies erfordert eine Codewartung an zwei verschiedenen Stellen, wodurch einfach ein weiterer Fehlerpunkt hinzugefügt wird.

    
Ian2thedv 20.07.2015 14:21
quelle
1

Ich stimme den vorherigen Antworten zu, aber ich werde ein wenig verallgemeinern. Das Problem mit der Methode returnSomething besteht darin, dass einige Rechtschreibprüfungen von der Kompilierzeit zur Laufzeit verschoben werden.

Es gibt Zeiten und Orte für sehr flexiblen Code, in dem die meisten Überprüfungen zur Laufzeit ausgeführt werden. In diesen Situationen verwende ich kein Java.

Der große Vorteil der Kompilierung von Zeitprüfungen und der Sprachen, die sie unterstützen, ist, dass sie äquivalent zu universell quantifizierten Tests sind: "Für jedes kompilierbare Programm, das keine Reflektion verwendet, ist jede get-Anfrage ein gültiges Attribut." statt "Für alle Testfälle in dieser Test-Suite ist jede get-Anfrage ein gültiges Attribut".

    
Patricia Shanahan 20.07.2015 20:37
quelle

Tags und Links