Ich bin neu in Java, und ich möchte einige Klassenvariablen erstellen, die beim Zugriff dynamisch berechnet werden, wie Sie in Python mit der Methode property() tun können. Ich bin mir jedoch nicht sicher, wie ich das beschreiben soll. Googling zeigt mir viel über die Java-Klasse "Property", aber das scheint nicht das Gleiche zu sein. Was ist das Java-Äquivalent von Pythons property()?Was ist das Java-Äquivalent von Pythons property()?
Antwort
Es gibt keine solche in Java integrierte Einrichtung. Sie müssen alle Getter und Setter explizit selbst schreiben. IDEs wie Eclipse können diesen Code aber auch für Sie generieren.
Zum Beispiel:
class Point{
private int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
public void setX(int x){
this.x = x;
}
public int getX(){
return x;
}
public void setY(int y){
this.y = y;
}
public int getY(){
return y;
}
}
Sie vielleicht einen Blick auf Project Lombok haben wollen, die die Anmerkungen @Getter
und @Setter
bereitstellt, die ein wenig ähnlich sind zu Pythons property
.
Mit Lombok, das obige Beispiel reduziert sich auf:
class Point{
@Getter @Setter private int x, y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}
Dies ist näher, erlaubt aber immer noch nicht, dynamische Methoden aufzurufen, wenn sich eine Eigenschaft (die wie ein Attribut verwendet wird) ändert. Hier ist ein Python-Code, der viele andere Objektattribute anpasst. Kaufen Sie einfach die URI: https://bitbucket.org/russellballestrini/miniuri/src/tip/miniuri.py –
Sie können weiter den oben gezeigten Konstruktor definieren mit @AllArgsConstructor. – Nik
Möchten Sie neue Felder/Getter/Setter in der Klasse erstellen? Wenn Sie dies in Runtime machen wollen, müssen Sie mit Ihren Feldern und Methoden eine komplett neue Klasse anlegen und in die JVM laden. Um eine neue Klasse zu erstellen, können Sie eine Bibliothek wie ASM oder CGLib verwenden, aber wenn Sie neu in Java sind, möchten Sie damit nicht beginnen.
Sie nicht wirklich existieren. In Java ist es üblich, Mitglieder als private
oder protected
zu deklarieren und den Zugriff nur über Methoden zu erlauben. Oft führt dies zu vielen kleinen Methoden getFoo()
und setFoo(newFoo)
. Python hat nicht wirklich private
und protected
und es ist häufiger, direkten Zugriff auf Mitglieder zu ermöglichen.
Wie andere bemerkt haben, hat Java Getter und Setter, aber es gibt kein strenges Analogon. Es gibt eine Third-Party-Bibliothek namens Project Lombok, die Annotation verwendet, um die Getter und Setter in den .class-Dateien zur Comile-Zeit zu generieren. Dies könnte verwendet werden, um die Dinge etwas weniger ausführlich zu machen.
-1, Wenn Sie nichts Neues hinzuzufügen haben, sollten Sie die bereits vorhandenen Antworten aktualisieren. –
Mein Zusatz wies auf Projekt Lombok hin. GreyMatter 9.0 hat später seine Antwort bearbeitet, um sie einzuschließen. –
Mach keine dummen Vorwürfe. Die Bearbeitungszeit meiner Antwort (13:18) liegt vor der Buchungszeit Ihrer Antwort (13:33). – missingfaktor
Eigentlich können Sie dieses Verhalten in Java simulieren.
WARNUNG: hässliche Lösung unter
Sie können eine Methode in einer Utility-Klasse wie der folgenden Code schreiben:
public Object getProperty(String property, Object obj) {
if (obj != null && property != null) {
Field field = obj.getClass().getDeclaredField(property);
field.setAccessible(true);
try {
return field.get(obj);
} catch (Exception ex) {
return null;
}
}
return null;
}
Sie es tatsächlich erklären können als statische Methode und importieren Sie dann nur diese Methode in Ihre Klassen, die dieses Verhalten benötigen.
Groovy unterstützt übrigens diese Funktion.
Bitte lesen Sie meinen Beitrag genauer. Ich suchte nicht nach einer Funktion, um auf Instanzmitglieder zuzugreifen. Ich suchte nach einem Feature, das eine Funktion aufruft, wenn ich auf ein Instanzmitglied referenziere. z.B. myobj.attribute = 123; würde tatsächlich tun: myobj.setAttribute (123); – Cerin
Die eingebaute property() - Funktion macht genau das Gegenteil von dem, was hier in den Antworten beschrieben wird. Es geht nicht darum, Getter und Setter für Membervariablen zu generieren. Sie können nur eine Methode aufrufen, indem Sie auf eine Eigenschaft zugreifen (obwohl Sie nur auf eine Variable in der Python-Klasse zugreifen, wird eine Funktion aufgerufen). (this post erklärt, wie und warum man es benutzt.)
das sagte, Java bietet nichts dergleichen an. noch mehr wird der Zugriff auf Eigenschaften in Java abgeraten. Ich denke, Sie könnten es in Groovy Skriptsprache und der Meta-Magie tun.aber ich weiß nicht, wie ich das machen soll.
- 1. Subclassing Pythons `property`
- 2. Was ist das Wort "property:" in Attribut
- 3. Was ist das Gegenteil von Pythons ord() Funktion?
- 4. Was ist das Ruby-Äquivalent von Pythons os.walk?
- 5. Was ist die Assoziativität von Pythons Operator **?
- 6. Was ist die Nummer von Pythons Zip (*)?
- 7. Pythons Property Decorator funktioniert nicht wie erwartet
- 8. Was ist das "urllib2" -Element des Pythons in Punktnetz?
- 9. Was ist das Groovy-Pendant zu Pythons dir()? siehe
- 10. Was ist das Matlab-Äquivalent zu Pythons "nicht in"?
- 11. Was beschreibt @property (.....) am besten? Wofür ist das eigentlich gut?
- 12. Was, auf der Erde, ist Property Modified?
- 13. Was genau ist das Iteratorprotokoll von Python?
- 14. Was ist die Bash-Entsprechung von Pythons Pass-Anweisung?
- 15. Was ist der Punkt von @property und @synthesize?
- 16. Ist das Shortcircuit-Verhalten von Pythons Any/All explizit?
- 17. Was ist das kleinste Intervall, das man zuverlässig mit Pythons threading.Timer verwenden kann?
- 18. Was macht Pythons __file__ eigentlich?
- 19. Was bedeutet das "r" in Pythons re.compile (r 'pattern flags')?
- 20. Was macht Pythons eingebaute __build_class__?
- 21. Was ist der Unterschied zwischen Pythons __add__ und __concat__?
- 22. Ist Pythons reduzierter() Kurzschluss?
- 23. Ist Pythons Protokollierungsmodul threadsicher?
- 24. In MsBuild, was ist der Unterschied zwischen Property und ItemGroup
- 25. Was ist HTTPHandler in Bezug auf Pythons urllib2-Bibliothek?
- 26. Ist Pythons Bool-Sortierung definiert?
- 27. Was ist das Gegenteil von "ist"?
- 28. Ist das Session-Objekt aus Pythons Requests-Bibliothek threadsicher?
- 29. Was ist dieses C# -Muster für die Property-Initialisierung?
- 30. Was ist die Entsprechung in PHP für Pythons Pass-Anweisung?
Danke für die Antworten. Nur um das klarzustellen, ich weiß, dass Java dich normalerweise dazu ermutigt, über Getter und Setter auf Mitglieder zuzugreifen. Meine Frage war, ob Java erlaubt Ihnen einen Zugang zu einem Mitglied (z. B. obj.member), und ruft den Getter/Setter hinter den Kulissen, so tat x = obj.member würde tatsächlich x = obj.getMember(). – Cerin