2009-05-17 15 views
22

Sono nuovo di Java, ma hanno una certa esperienza OOP con ActionScript 3, quindi sto cercando di migrare basandosi su cose che conosco.Getters/setters in Java

In ActionScript 3 è possibile creare getter e setter utilizzando get e set di parole chiave, il che significa che si crea un metodo nella classe e si accede ai dati tramite una proprietà di un'istanza di tale classe. Potrei sembrare complicato, ma non lo è. Ecco un esempio:

class Dummy{ 

    private var _name:String; 

    public function Dummy(name:String=null){ 
     this._name = name; 
    } 

    //getter 
    public function get name():String{ 
     return _name; 
    } 

    //setter 
    public function set name(value:String):void{ 
    //do some validation if necessary 
     _name = value; 
    } 

} 

E vorrei accedere name in un oggetto come:

var dummy:Dummy = new Dummy("fred"); 
trace(dummy.name);//prints: fred 
dummy.name = "lolo";//setter 
trace(dummy.name);//getter 

Come dovrei farlo in Java?

Basta avere alcuni campi pubblici è fuori questione. Ho notato che esiste questa convenzione sull'uso di get e set di fronte ai metodi, con cui sto bene.

Ad esempio,

class Dummy{ 

    String _name; 

    public void Dummy(){} 

    public void Dummy(String name){ 
     _name = name; 
    } 

    public String getName(){ 
     return _name; 
    } 

    public void setName(String name){ 
     _name = name; 
    } 

} 

V'è l'equivalente di ActionScript 3 getter/setter in Java, come in accedere un campo privato come campo da un'istanza della classe, ma con un metodo per l'implementazione quello internamente nella classe?

+13

Sembra che si sta colpendo un punto molto sensibile per i programmatori Java;) – bbmud

+0

Grazie a tutti voi per l'ingresso. Continuerò ad attenermi alle convenzioni Java durante la scrittura del codice Java da ora in poi :) Per quanto riguarda gli IDE, ho provato Eclipse e NetBeans e mi piacciono entrambi, non riesco a decidermi. NetBeans ha alcune caratteristiche interessanti della GUI (ha appena controllato i campioni). Continuerò ad usare Terminal per iniziare (per fare barattoli) e tutto il resto, almeno fino a quando non mi rimetterò in piedi. Opinioni dei principianti su Java: yay: MOLTO potere! meh: devi fare tutto? Per ottenere qualcosa di serio da terra sembra che tu abbia bisogno di scrivere MOLTO codice. –

risposta

20

Nope. I getter e setter AS3 sono una cosa ECMAScript. In Java, sei bloccato con le funzioni di stile getVal() e setVal() - non c'è alcuno zucchero sintattico per semplificarti le cose.

Credo che Eclipse può aiutare auto-generazione di quei tipi di cose anche se ...

+2

Così fa Netbeans con "Incapsula Fields" – nxadm

+1

così fa Emacs/JDEE con M-x JDE-gen-get-set-metodi. – Glenn

+12

Sì. Il tuo editor di scelta probabilmente può fare la stessa cosa. Ho sentito che M-x M-butterfly può anche scrivere il resto del programma per te :) – zenazn

2

In Java, l'unica opzione che avete senza esporre le parti interne del vostro oggetto è quello di rendere i propri getter e setter come si deve nel tuo esempio.

La convenzione deve anteporre get o set davanti al campo che viene modificato. Così, come nel tuo esempio, il campo name avrebbe getName e setName metodi come loro corrispondenti getter e setter, rispettivamente.

10

Il codice Java va bene, tranne che si desidera effettuare _nameprivato.

Non ci sono alcun ottenere e impostare parole chiave in Java come nel tuo esempio AS3. Scusa, non migliora di quello che stai facendo già.

codice corretto:

class Dummy { 
    private String _name; 

    public void Dummy() {} 

    public void Dummy(String name) { 
    setName(name); 
    } 

    public String getName() { 
    return _name; 
    } 

    public void setName(String value) { 
    _name = value; 
    } 
} 
+0

Grazie per il collegamento, seguirò le convenzioni Java quando scrivo Java. E prometto di chiamare i campi delle proprietà quando si parla di Java;) –

+0

@George Proprietà e campi sono concetti diversi. Una proprietà può o non può essere memorizzata in un campo (l'area di un cerchio è una proprietà e può esserci un metodo getArea, ma internamente può essere calcolato dal raggio). –

+0

@Adam Ho pensato che le funzioni di una classe sono indicate come metodi (privati, pubblici, ecc.) E le variabili di una classe sono indicate come proprietà/campi. Non sono sicuro al 100% che segua il tuo esempio. Stai dicendo che circle.area e circle.getArea() sono entrambe proprietà di una classe Circle? Grazie per aver sottolineato che le proprietà e i campi sono diversi. –

3

Purtroppo no, non v'è il supporto equivalente a livello di linguaggio Java.

I pattern get * e set * sono però così consolidati in java culture che troverete un forte supporto IDE per loro (ad esempio, eclipse li renderà automaticamente per voi), e se state lavorando in qualcosa che usa la lingua dell'espressione creata per jsps (EL), quindi sarai in grado di utilizzare la notazione delle proprietà per accedere a getter e setter.

3

vorrei prendere in considerazione non avendo il getter o setter in quanto non fanno nulla nel tuo caso, tranne rendere il codice più complicato. Ecco un esempio senza getter o setter.

class Dummy { 
    public String name; 
    public Dummy(String name) { this.name = name; } 
} 

Dummy dummy = new Dummy("fred"); 
System.out.println(dummy.name);//getter, prints: fred 
dummy.name = "lolo";//setter 
System.out.println(dummy.name);//getter, prints: lolo 

IMHO Non rendere le cose più complicate di quanto è necessario. Succede spesso che l'aggiunta di complessità risenta di You-Aint-Gonna-Need-It

+0

IMHO vi sbagliate. L'incapsulamento suggerisce che tutti i campi devono essere privati ​​e che i metodi getter e setter devono accedere ai campi. Se scrivi una domanda complessa con la tua classe fittizia, e un giorno devi pensare che il nome non può essere vuoto, la classe di George potrebbe essere riscritta con un assegno. Se si deve fare lo stesso modificare alla classe, si deve privatizzare il campo del nome, scrivere un getter e setter (dove per verificare che il nome could'n essere nullo) e modificare tutti l'applicazione in cui si riferisce al campo . –

1

Inoltre, prima di aggiungere setter e getter, potrebbe essere una buona idea chiedersi perché stai esponendo i dati interni dell'oggetto in questione.
mi suggerisce di leggere questo articolo - http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html

+0

Prendere qualsiasi cosa Alan Holub dice con un enorme granello di sale; è un estremista che nasconde l'incapsulamento come dato. Se stai scrivendo un'app di simulazione, accetto che non vuoi esporre lo stato; ma per altre app, pensate all'incapsulamento come protezione dei dati (controllo delle modifiche ai vostri dati) rispetto al nascondimento dei dati (non permettete agli altri di sapere che avete dati) –

+1

Immagino che si possa definire Holub un estremista, ma il punto di Holub è anche portato su Joshua Bloch, vedere Effective Java Item 13 - http://books.google.com/books?id=ZZOiqZQIbRMC&pg=PA63&lpg=PA63&dq=favor+immutability&source=bl&ots=UZOZ8thI62&sig=FwssZOJiYmMmxS3nATJpW4Xri-8&hl=en&ei=57wRSpf5BZfKtgfm-ImRCA&sa= X & oi = book_result & ct = result & resnum = 2 # PPA63, M1 – KingInk

3

Un modo IDE indipendente è quello di utilizzare Lombok, una libreria di annotazione-based che genera getter, setter, e anche equals() e hashcode(). Lo fa per il compilatore, ma non nel file sorgente, quindi non devi guardare i metodi, basta usarli.

+0

Design orribile (rosso strano, molti tipi di caratteri diversi e non adatti), strumento pratico! Grazie drorribile! –