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?
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 Sie können weitere Informationen über lombok Getter und Setter bekommen hier . 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). 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 sollten auf jeden Fall auch .
Meine Favoriten sind:
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
oderref
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 vonMarshalByRefObject
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-LeseNow
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
desTickCount
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,