2010-01-13 12 views
8

Sono nuovo di Java, e vorrei creare alcune variabili di classe che vengono calcolate dinamicamente quando si accede, come si può fare in Python usando il metodo property(). Tuttavia, non sono proprio sicuro di come descriverlo, quindi Googling mi mostra molte cose sulla classe "Property" di Java, ma questa non sembra essere la stessa cosa. Qual è l'equivalente Java della proprietà Python()?Qual è l'equivalente di Java della proprietà Python()?

+0

Grazie per le risposte. Giusto per chiarire, so che in genere Java ti incoraggia ad accedere ai membri attraverso getter e setter. La mia domanda era se Java ti permette di accedere ad un membro (ad esempio obj.member), e chiama getter/setter dietro le quinte, così x = obj.member farebbe effettivamente x = obj.getMember(). – Cerin

risposta

7

Non esiste una tale funzione integrata nel linguaggio Java. Devi scrivere tutti i getter e setter in modo esplicito da solo. Tuttavia, IDE come Eclipse possono generare questo codice standard.

Ad esempio:

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

Si potrebbe desiderare di avere uno sguardo a Project Lombok che fornisce le annotazioni @Getter e @Setter che sono in qualche modo simile a Python di property.

Con Lombok, l'esempio precedente si riduce a:

class Point{ 
    @Getter @Setter private int x, y; 

    public Point(int x, int y){ 
    this.x = x; 
    this.y = y; 
    } 
} 
+0

Questo è più vicino ma continua a non consentire ai metodi dinamici di invocare quando una proprietà (che viene utilizzata come un attributo) cambia. Ecco alcuni codici Python che regolano molti altri attributi dell'oggetto acquistando semplicemente "impostando" l'uri: https://bitbucket.org/russellballestrini/miniuri/src/tip/miniuri.py –

+1

Puoi inoltre eliminare la definizione del costruttore mostrato sopra usando @AllArgsConstructor. – Nik

0

Vuoi creare nuovi campi/getter/setter nella classe? Se vuoi farlo in runtime, devi creare una classe completamente nuova con i tuoi campi e metodi e caricarla nella JVM. Per creare una nuova classe puoi usare una libreria come ASM o CGLib, ma se sei nuovo in Java, questo non è qualcosa che vuoi iniziare.

2

in realtà non esistono. In Java è prassi comune dichiarare membri come private o protected e consentire l'accesso ad essi solo tramite i metodi. Spesso questo porta a molti piccoli metodi getFoo() e setFoo(newFoo). Python in realtà non ha private e protected ed è più comune consentire l'accesso diretto ai membri.

1

Come altri hanno notato, java ha getter e setter, ma non esiste un'analogia rigorosa. Esiste una libreria di terze parti chiamata Project Lombok che utilizza l'annotazione per generare i getter e i setter nei file .class in tempo utile. Questo potrebbe essere usato per rendere le cose un po 'meno prolisse.

+3

-1, quando non hai nulla di nuovo da aggiungere, devi invertire le risposte già esistenti. –

+0

La mia aggiunta stava indicando Project Lombok. GreyMatter 9.0 ha poi modificato la sua risposta per includerla. –

+0

Non fare accuse sciocche. Il tempo di modifica della mia risposta (13:18) è precedente all'ora di pubblicazione della risposta (13:33). – missingfaktor

-1

In realtà è possibile simulare questo comportamento in Java.

ATTENZIONE: brutta soluzione qui di seguito

È possibile scrivere un metodo in una classe di utilità come il codice qui sotto:

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

si può effettivamente dichiara come un metodo statico e poi basta importare questo metodo nelle tue classi che avranno bisogno di questo comportamento.

A proposito, Groovy supporta questa funzione.

+0

Si prega di leggere il mio post più da vicino. Non stavo cercando una funzione per accedere ai membri dell'istanza. Stavo cercando una funzionalità che chiama una funzione quando faccio riferimento a un membro di istanza. ad es. myobj.attribute = 123; farebbe effettivamente: myobj.setAttribute (123); – Cerin

3

la funzione property() integrata fa esattamente l'opposto di quanto descritto qui nelle risposte. non si tratta di generare getter e setter per le variabili membro. ti consente semplicemente di chiamare un metodo accedendo a una proprietà (quindi, anche se accedi a una variabile nella classe Python, verrà chiamata una funzione). (this post ecplains come e perché usarlo)
detto questo, Java non offre nulla di simile. ancora di più, l'accesso alla proprietà è scoraggiato in Java. Immagino che potresti farlo nel linguaggio di Groovy e nella meta-magia.ma non so fuori di testa come farlo.

Problemi correlati