Domanda

Così, ho volutamente guardato un Java n00b fino a poco tempo fa, e la mia prima vera esposizione portato ad una minore shock:Java non sono C# proprietà di stile!

Ok, posso vivere con questo.Tuttavia, posso anche giurare che ho visto di proprietà getter/setter di codice in Java in una codebase, ma non ricordo dove.Come è stato ottenuto?C'è un linguaggio di estensione?È correlato con NetBeans o qualcosa del genere?

È stato utile?

Soluzione

C'è uno "standard" modello per i getter e i setter in Java, chiamato Proprietà Bean.Praticamente qualsiasi metodo di partenza con get, senza argomenti e la restituzione di un valore, è una proprietà getter per una proprietà che si chiama come il resto del nome del metodo (con un minuscolo lettera iniziale).Allo stesso modo set crea un setter di un metodo void con un unico argomento.

Per esempio:

// Getter for "awesomeString"
public String getAwesomeString() {
  return awesomeString;
}

// Setter for "awesomeString"
public void setAwesomeString( String awesomeString ) {
  this.awesomeString = awesomeString;
}

La maggior parte Java Ide genererà questi metodi per voi, se si chiede loro (in Eclipse è semplice come muovere il cursore su un campo e premendo ctrl-1, quindi selezionando l'opzione dall'elenco).

Per quello che vale, per migliorare la leggibilità si può effettivamente utilizzare is e has in luogo di get boolean-tipo di proprietà, come in:

public boolean isAwesome();

public boolean hasAwesomeStuff();

Altri suggerimenti

Sono sorpreso che nessuno menziona progetto di lombok

Sì, attualmente non ci sono immobili in java.Ci sono altre caratteristiche mancanti così.
Ma per fortuna abbiamo progetto di lombok che sta cercando di migliorare la situazione.È anche sempre più popolare ogni giorno.

Quindi, se si sta utilizzando lombok:

@Getter @Setter int awesomeInteger = 5;

Questo codice è andando a generare getAwesomeInteger e setAwesomeInteger come bene.Quindi è del tutto simile a C# auto di proprietà implementate.

È possibile ottenere ulteriori informazioni su lombok getter e setter qui.
Si dovrebbe verificare altre caratteristiche come bene.I miei preferiti sono:

Lombok è ben integrato con gli Ide, quindi è intenzione di mostrare metodi generati come se esistessero (suggerimenti, classe di contenuto, vai alla dichiarazione e refactoring).
L'unico problema con l'isola di lombok è che altri programmatori potrebbero non sapere.Si può sempre delombok il codice, ma che è piuttosto una soluzione di una soluzione.

"Java Struttura di Supporto" è stato proposto per Java 7, ma non nel linguaggio.

Vedere http://tech.puredanger.com/java7#property per ulteriori collegamenti e informazioni, se interessati.

Il fagiolo convenzione è quello di scrivere un codice come questo:

private int foo;
public int getFoo() {
    return foo;
}
public void setFoo(int newFoo) {
    foo = newFoo;
}

In alcune altre lingue su JVM, ad esempio, Groovy, si ottiene overridable proprietà simile a C#, ad esempio,

int foo

a cui si accede con un semplice .foo e si avvale di default getFoo e setFoo implementazioni che è possibile ignorare come necessario.

public class Animal {

    @Getter @Setter private String name;
    @Getter @Setter private String gender;
    @Getter @Setter private String species;
}

Questo è qualcosa di simile a C# proprietà.È http://projectlombok.org/

Potrebbe non essere necessario per "ottenere" e "set" prefissi, per farlo sembrare più come proprietà, si può fare così:

public class Person {
    private String firstName = "";
    private Integer age = 0;

    public String firstName() { return firstName; } // getter
    public void firstName(String val) { firstName = val; } // setter

    public Integer age() { return age; } // getter
    public void age(Integer val) { age = val; } //setter

    public static void main(String[] args) {
        Person p = new Person();

        //set
        p.firstName("Lemuel");
        p.age(40);

        //get
        System.out.println(String.format("I'm %s, %d yearsold",
            p.firstName(),
            p.age());
    }
}

L'Ide per Java consente di generare automaticamente i metodi getter e setter codice per voi, se si desidera loro di.Ci sono un certo numero di diversi tipi di convenzioni, e di un IDE come Eclipse, sarà possibile scegliere quella che si desidera utilizzare, e anche consentono di definire i propri.

Eclipse include anche automatizzato di refactoring che vi permetterà di avvolgere una proprietà in un getter e setter e modificare tutto il codice che accede direttamente alla proprietà, per rendere l'uso del getter e/o setter.

Naturalmente, Eclipse può solo modificare il codice che si sa sulle - dipendenze esterne che hanno potuto essere rotto da un refactoring.

Da Jeffrey Richter prenota CLR via C#:(Penso che questi potrebbero essere i motivi per cui le proprietà sono ancora aggiunto in JAVA)

  • Una proprietà metodo può lanciare un'eccezione;accesso al campo non genera un'eccezione.
  • Una proprietà non può essere passato come out o ref parametro di un metodo;un campo può.
  • Un metodo di proprietà può prendere un lungo tempo di esecuzione;accesso al campo sempre completa subito.Un motivo comune per utilizzare le proprietà è quello di eseguire la sincronizzazione dei thread, che può interrompere il filo per sempre, e, di conseguenza, una proprietà non dovrebbe essere utilizzato se la sincronizzazione dei thread è richiesto.In quella situazione, un metodo è preferito.Inoltre, se la tua classe è possibile accedere in remoto (ad esempio, la classe è derivata da System.MarshalByRefObject), chiamando il metodo della proprietà sarà molto lento, e pertanto, un metodo è preferibile a una proprietà.A mio parere, le classi derivate da MarshalByRefObject non dovrebbe mai utilizzare le proprietà.
  • Se chiamato più volte in una riga, in una proprietà metodo può restituire un valore diverso ogni tempo;un campo restituisce lo stesso valore di ogni tempo.Il System.DateTime la classe ha una sola lettura Now proprietà che restituisce la data e l'ora correnti.Ogni volta che si esegue una query di questo la struttura, verrà restituito un valore diverso.Questo è un errore, e Microsoft che desideri si potrebbe risolvere la classe, facendo Ora un metodo invece di una proprietà. Environment’s TickCount proprietà è un altro esempio di questo errore.
  • Un metodo di proprietà può causare osservabili effetti collaterali;accesso al campo non fa mai.In altre parole, un utente di un tipo deve essere in grado di impostare diverse proprietà definite da un tipo in qualsiasi ordine che lui o lei sceglie, senza accorgersi di qualsiasi comportamento diverso tipo.
  • Un metodo di proprietà richiedono più memoria, o restituire un riferimento a qualcosa che non è in realtà parte di lo stato dell'oggetto, in modo da modificare l'oggetto restituito non ha effetto sull'oggetto originale;esecuzione di query su un campo sempre restituisce un riferimento a un oggetto che è garantito per essere parte dell'oggetto originale stato.Lavora con una struttura che restituisce una copia può essere molto confusa per gli sviluppatori, e questa caratteristica è spesso non è documentato.

La mia esperienza Java non è elevata, in modo che chiunque esitate a correggermi.Ma, per quanto ne so, la convenzione generale è quello di scrivere due metodi in questo modo:

public string getMyString() {
    // return it here
}

public void setMyString(string myString) {
    // set it here
}

Se si utilizza eclipse quindi ha la capacità di auto generare i metodi getter e setter per le caratteristiche interne, può essere un utile strumento di risparmio di tempo.

Io sono solo il rilascio di Java 5/6 annotazioni e un'annotazione processore per aiutare questo.

Check out http://code.google.com/p/javadude/wiki/Annotations

La documentazione è un po ' di luce in questo momento, ma il quickref dovrebbe ottenere l'idea.

Fondamentalmente si genera una superclasse con i metodi getter/setter (e molte altre opzioni di generazione del codice).

Un esempio di classe potrebbe apparire come

@Bean(properties = {
    @Property(name="name", bound=true),
    @Property(name="age,type=int.class)
})
public class Person extends PersonGen {
}

Ci sono molti più campioni a disposizione, e non ci sono dipendenze di runtime nel codice generato.

Mandami una mail, se lo provi e lo trovo utile!-- Scott

Non c'è nessuna proprietà di parola chiave in java (come si potrebbe trovare in C#) la stazione più vicina modo per avere 1 parola getter/setter è fare come in C++:

public class MyClass
{
    private int aMyAttribute;
    public MyClass()
    {
        this.aMyAttribute = 0;
    }
    public void mMyAttribute(int pMyAttributeParameter)
    {
        this.aMyAttribute = pMyAttributeParameter;
    }
    public int mMyAttribute()
    {
        return this.aMyAttribute;
    }
}
//usage :
int vIndex = 1;
MyClass vClass = new MyClass();
vClass.mMyAttribute(vIndex);
vIndex = 0;
vIndex = vClass.mMyAttribute();
// vIndex == 1

Come accennato in precedenza per eclipse, ambiente di sviluppo integrato (IDE) spesso può creare metodi supplementari automaticamente.

È possibile farlo utilizzando NetBeans.

Per creare metodi supplementari per la vostra classe, aprire un file di classe, quindi fare clic Destro in qualsiasi punto nell'editor di codice sorgente e scegliere il comando di menu Refactoring, Incapsulare i Campi.Una finestra di dialogo si apre.Fare clic su Seleziona Tutto, quindi fare clic su Refactoring.Voilà,

Buona fortuna,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top