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()?
risposta
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;
}
}
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 –
Puoi inoltre eliminare la definizione del costruttore mostrato sopra usando @AllArgsConstructor. – Nik
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.
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.
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.
-1, quando non hai nulla di nuovo da aggiungere, devi invertire le risposte già esistenti. –
La mia aggiunta stava indicando Project Lombok. GreyMatter 9.0 ha poi modificato la sua risposta per includerla. –
Non fare accuse sciocche. Il tempo di modifica della mia risposta (13:18) è precedente all'ora di pubblicazione della risposta (13:33). – missingfaktor
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.
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
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.
- 1. Qual è il python per Java BigDecimal?
- 2. Qual è il limite della lunghezza di una proprietà javascript?
- 3. Java ottiene il valore della proprietà per nome della proprietà
- 4. Qual è esattamente la funzione della proprietà Application.CutCopyMode in Excel
- 5. Qual è lo scopo della proprietà FormsAuthenticationTicket isPersistent?
- 6. Qual è lo scopo della proprietà webkitRelativePath nell'oggetto File?
- 7. RequireJS - Qual è lo scopo della proprietà "exports" nello shim
- 8. Qual è il significato della proprietà del costruttore Javascript?
- 9. Qual è lo scopo principale della proprietà List.single?
- 10. Qual è l'utilizzo della proprietà AccessibleRole in un controllo utente?
- 11. Qual è l'uso della proprietà isLocal in jQuery Ajax?
- 12. Qual è l'opposto della funzione ord() di python?
- 13. Qual è il significato della proprietà 'aria-describedby'?
- 14. Qual è lo scopo della proprietà "privato" in package.json?
- 15. qual è la dimensione della variabile di riferimento in java
- 16. Qual è la proprietà di UITableView separatorEffect?
- 17. Qual è la proprietà .NET Control.Margin per?
- 18. Qual è lo scopo dell'estensione della classe serializzabile Java?
- 19. Java: Qual è lo scopo della setDoInput in URLConnection
- 20. Qual è lo scopo della finalizzazione in Java?
- 21. Qual è lo scopo della serializzazione in Java?
- 22. Qual è l'equivalente di java di ManualResetEvent?
- 23. Gestione della localizzazione di file di proprietà Java
- 24. Qual è l'analogico della proprietà della direttiva 'controllerAs' nel componente Angular 2?
- 25. Qual è l'effetto del contenuto: "\ 0020"; proprietà?
- 26. Qual è l'operatore & = per Java
- 27. Qual è l'equivalente di "gem" in python?
- 28. Python: Qual è l'equivalente di PHP "=="
- 29. Qual è l'equivalente Python di R's NA?
- 30. Qual è il significato di "_" in python?
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