Frage

So habe ich gehalten mutwillig selbst ein Java n00b bis vor kurzem, und meine erste richtige Belichtung brachte einen kleineren Schock: Java nicht C # Stil Eigenschaften hat

!

Ok, ich kann damit leben. Allerdings kann ich schwöre auch, dass ich Eigenschaft Getter / Setter-Code in Java in einer Code-Basis gesehen habe, aber ich kann mich nicht erinnern, wo. Wie wurde das erreicht? Gibt es eine Spracherweiterung für das? Ist es im Zusammenhang mit NetBeans oder etwas?

War es hilfreich?

Lösung

Es gibt ein "Standard" Muster für die Getter und Setter in Java, die so genannten Bean Eigenschaften . Grundsätzlich kann jede Methode mit get beginnend, ohne Argumente und einen Wert zurückkehrt, ist eine Eigenschaft Getter für eine Eigenschaft, wie der Rest des Verfahrens benannt (mit einem Kleinbuchstaben Startbuchstaben). Ebenso schafft set eine Setter einer void-Methode mit einem einzigen Argumente.

Zum Beispiel:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

Die meisten Java IDEs werden diese Methoden für Sie generieren, wenn man sie fragt, (in Eclipse es so einfach ist, wie Sie den Cursor auf ein Feld bewegen und Drücken von Strg-1, dann die Option aus der Liste auswählen).

Für das, was es wert ist, zur besseren Lesbarkeit können Sie tatsächlich is und has anstelle von get für boolean-Typen Eigenschaften verwenden zu, wie in:

public boolean isAwesome();

public boolean hasAwesomeStuff();

Andere Tipps

Ich bin überrascht, dass niemand Projekt erwähnt lombok

Ja, gibt es derzeit keine Immobilien in Java. Es gibt einige andere fehlende Features auch.
Aber zum Glück haben wir Projekt lombok , die die Situation zu verbessern versucht. Es wird auch immer beliebter jeden Tag zu bekommen.

Also, wenn Sie mit lombok:

@Getter @Setter int awesomeInteger = 5;

Dieser Code wird auch getAwesomeInteger und setAwesomeInteger zu erzeugen. So ist es durchaus ähnlich href="http://msdn.microsoft.com/en-us/library/bb384054.aspx" rel="noreferrer"> C # automatisch implementierte Eigenschaften

Sie können weitere Informationen über lombok Getter und Setter bekommen hier .
Sie sollten auf jeden Fall auch . Meine Favoriten sind:

Lombok ist gut integriert mit IDEs, so wird es zu generierten Methoden wie zeigen, wenn sie existieren (Anregungen, Klasse Inhalte, geht zur Erklärung und Refactoring).
Das einzige Problem mit lombok ist, dass andere Programmierer nicht darüber wissen könnte. Sie können jederzeit delombok der Code aber das ist eher eine Abhilfe als eine Lösung.

"Java Property Support" wurde für Java vorgeschlagen 7, sich aber nicht in die Sprache machen.

Siehe http://tech.puredanger.com/java7#property für mehr Links und Informationen, wenn Interesse besteht.

Die Bean-Konvention ist der Code wie folgt zu schreiben:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

In einige der anderen Sprachen auf der JVM, zum Beispiel, Groovy, erhalten Sie overridable Eigenschaften ähnlich wie C #, z. B.

int foo

, die mit einem einfachen .foo zugegriffen wird, und nutzen Standard-getFoo und setFoo Implementierungen, die Sie bei Bedarf überschreiben können.

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

Das ist so etwas wie C # Eigenschaften. Es ist http://projectlombok.org/

Sie können nicht brauchen für „get“ und „set“ Präfixe, um es ähnliche Eigenschaften aussehen, können Sie es so machen kann:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}

Die meisten IDEs für Java wird automatisch Getter und Setter-Code für Sie, wenn Sie sie wollen. Es gibt eine Reihe von verschiedenen Konventionen und eine IDE wie Eclipse ermöglicht es Ihnen, zu wählen, welche Sie verwenden möchten, und lassen Sie sogar Ihre eigenen definieren.

Eclipse-enthält sogar automatisierte Refactoring, dass Sie eine Eigenschaft oben in einem Getter und Setter wickeln können, und es wird den gesamten Code zu ändern, die die Eigenschaft direkt zugreift, um den Getter und / oder Setter zu machen verwenden.

Natürlich können Eclipse-Code nur ändern, die es kennt -. Alle externen Abhängigkeiten Sie haben durch eine solche Refactoring gebrochen werden konnte

Jeffrey Richters Buch CLR via C # : (Ich denke, diese könnten die Gründe sein, warum Eigenschaften sind noch nicht in JAVA hinzugefügt)

  • Eine Eigenschaft Methode kann eine Ausnahme auslösen; Feldzugriff wirft nie eine Ausnahme aus.
  • Eine Eigenschaft kann nicht als out oder ref Parameter an eine Methode übergeben werden; Ein Feld kann.
  • kann eine Eigenschaft Methode eine lange Zeit in Anspruch nehmen auszuführen; Feldzugriff immer abgeschlossen sofort. Ein häufiger Grund Eigenschaften zu verwenden ist Thread-Synchronisation durchzuführen, das kann den Faden stoppen immer, und daher sollte eine Eigenschaft nicht sein wenn Thread-Synchronisierung verwendet, erforderlich ist. In dieser Situation wird ein Verfahren bevorzugt. Auch kann, wenn die Klasse der Ferne zugegriffen werden (zum Beispiel Ihre Klasse ist abgeleitet von System.MarshalByRefObject) wird die Eigenschaft Methode aufrufen sehr langsam, und Daher wird ein Verfahren auf eine Eigenschaft bevorzugt. Meiner Meinung nach, abgeleiteten Klassen von MarshalByRefObject sollte nie verwenden, um Eigenschaften.
  • Wenn mehrere Male hintereinander genannt, kann eine Eigenschaft Methode einen anderen Wert zurückgeben jede Zeit; ein Feld gibt den gleichen Wert jedes Mal. Die System.DateTime Klasse hat eine Nur-Lese Now Eigenschaft, die das aktuelle Datum und die Uhrzeit zurückgibt. Jedes Mal, wenn Sie diese Abfrage Eigenschaft, wird es einen anderen Wert zurück. Das ist ein Fehler, und Microsoft wünscht sich, dass sie konnten die Klasse beheben, ein Verfahren Anstatt nun eine Eigenschaft, indem. Environment des TickCount Eigenschaft ist ein weiteres Beispiel für diesen Fehler.
  • Eine Eigenschaft Methode kann beobachtbare Nebenwirkungen verursachen; Feldzugriff nie. In anderen Worten, sollte ein Benutzer eines Typs, der Lage sein, verschiedene Eigenschaften durch eine Art definiert einzustellen, in jeder Befehl, den er oder sie wählt, ohne in der Art anders Verhalten zu bemerken.
  • Eine Eigenschaft Methode kann zusätzliche Speicher benötigen oder einen Verweis auf etwas zurückgeben das ist nicht tatsächlich ein Teil des Zustand des Objekts, so dass die zurückgegebene Objekt hat keine Modifizierung Wirkung auf das Original-Objekt; ein Feld Abfrage gibt immer einen Verweis auf ein Objekt dass gewährleistet ist Teil des ursprünglichen Objekts Zustand zu sein. Arbeiten mit einer Eigenschaft dass gibt eine Kopie kann für Entwickler sehr verwirrend sein, und diese Eigenschaft ist häufig nicht dokumentiert.

Meine Java Erfahrung ist nicht, dass entweder hoch, so dass jemand, mich zu korrigieren fühlt sich frei. Aber AFAIK ist die allgemeine Konvention zwei Methoden zu schreiben, etwa so:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}

Wenn Sie Eclipse verwenden dann hat es die Fähigkeiten zur automatischen Erzeugung der Getter und Setter-Methode für die internen Attribute, kann es ein nützliches und zeitsparend Werkzeug sein.

Ich bin die Freigabe nur Java 6.5 Anmerkungen und eine Anmerkung Prozessor dabei zu helfen.

Schauen Sie sich http://code.google.com/p/javadude/wiki / Erläuterungen

Die Dokumentation ist ein wenig Licht im Moment, aber die QuickRef sollte die Idee zu vermitteln.

Im Grunde erzeugt es eine übergeordnete Klasse mit den Getter / Setter (und vielen anderen Code-Generierung Optionen).

Eine Beispielklasse könnte so aussehen

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

Es gibt viele weitere Proben zur Verfügung, und es gibt keine Laufzeitabhängigkeiten in den generierten Code.

Senden Sie mir eine E-Mail, wenn Sie es ausprobieren und finden es nützlich! - Scott

Es gibt keine Eigenschaft Schlüsselwort in Java den nächsten Weg 1 Wort Getter haben (wie Sie es in C # finden können) / Setter ist wie in C ++ zu tun:

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1

Wie bereits für Eclipse erwähnt, integrierte Entwicklungsumgebung (IDE) kann oft Accessormethoden automatisch erstellen.

Sie können auch tun es NetBeans verwenden.

Um Zugriffsmethoden für Ihre Klasse zu erstellen, eine Klassendatei öffnen, dann die rechte Maustaste irgendwo im Quelltext-Editor und wählen Sie den Menübefehl Umgestalten, Encapsulate Felder. Ein Dialog wird geöffnet. Klicken Sie auf Alles markieren, und klicken Sie auf Umgestalten. Voilà,

Viel Glück,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top