2010-01-13 6 views
8

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()?

+0

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

Antwort

7

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; 
    } 
} 
+0

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 –

+1

Sie können weiter den oben gezeigten Konstruktor definieren mit @AllArgsConstructor. – Nik

0

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.

2

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.

1

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.

+3

-1, Wenn Sie nichts Neues hinzuzufügen haben, sollten Sie die bereits vorhandenen Antworten aktualisieren. –

+0

Mein Zusatz wies auf Projekt Lombok hin. GreyMatter 9.0 hat später seine Antwort bearbeitet, um sie einzuschließen. –

+0

Mach keine dummen Vorwürfe. Die Bearbeitungszeit meiner Antwort (13:18) liegt vor der Buchungszeit Ihrer Antwort (13:33). – missingfaktor

-1

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.

+0

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

3

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.

Verwandte Themen