it-swarm-eu.dev

(ne) Vlastnosti v jazyce Java?

Tak jsem se donedávna vědomě držel Java n00b a moje první reálná expozice způsobila menší šok: Java nemá vlastnosti ve stylu C #!

Ok, můžu s tím žít. Nicméně, mohu také přísahat, že jsem viděl vlastnost getter/setter kód v Javě v jedné codebase, ale nemohu si vzpomenout, kde. Jak toho bylo dosaženo? Existuje pro to jazykové rozšíření? Souvisí to s NetBeans nebo tak něco?

53
Ishmaeel

Tam je “standardní” vzor pro getters a setters v Javě, nazvaný Bean vlastnosti . V podstatě jakákoliv metoda začínající na get, která nebere žádné argumenty a vrací hodnotu, je vlastnost getter pro vlastnost pojmenovanou jako zbytek názvu metody (s nižším začátečním písmenem). Podobně set vytvoří setter metody void s jedním argumentem.

Například:

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

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

Většina Java IDE pro vás vygeneruje tyto metody, pokud se jich zeptáte (v Eclipse je to tak jednoduché jako pohyb kurzoru na pole a blikání ctrl-1, pak výběr ze seznamu).

Pro to, co stojí za to, můžete čitelnost skutečně použít is a has namísto get také pro vlastnosti boolean-type, jako v:

public boolean isAwesome();

public boolean hasAwesomeStuff();
61
Calum

Překvapuje mě, že nikdo neřekl projekt lombok

Ano, v současné době nejsou v Javě žádné vlastnosti. Tam jsou některé jiné chybějící funkce také.
Naštěstí máme projekt lombok který se snaží situaci zlepšit. To je také stále více a více populární každý den.

Pokud tedy používáte lombok:

@Getter @Setter int awesomeInteger = 5;

Tento kód bude také generovat getAwesomeInteger a setAwesomeInteger. Takže je to docela podobné C # auto-implementovaným vlastnostem .

Můžete získat více informací o lombok getters a setters zde .
Měli byste určitě vyzkoušet další funkce také. Moje oblíbené jsou: 

Lombok je dobře integrovaný s IDE, takže bude zobrazovat generované metody, jako kdyby existovaly (návrhy, obsah třídy, jít na deklaraci a refactoring).
Jediný problém s lombok je, že ostatní programátoři o něm nemusí vědět. Můžete vždy delombok kód, ale to je spíše řešení než řešení.

"Java Property Support" byla navržena pro Java 7, ale neudělala to do jazyka.

Viz http://tech.puredanger.com/Java7#property pro více odkazů a informací, pokud máte zájem.

6
Cheekysoft

Konvence fazole má napsat takový kód:

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

V některých dalších jazycích na JVM, např. Groovy, získáte přepsatelné vlastnosti podobné C #, např.

int foo

který je přístupný pomocí jednoduchého .foo a využívá implicitní implementace getFoo a setFoo, které můžete podle potřeby přepsat.

6
Hank Gay
public class Animal {

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

Toto je něco jako C # vlastnosti. Je to http://projectlombok.org/

6
dantuch

Možná nebudete potřebovat prefixy „get“ a „set“, aby to vypadalo jako vlastnosti, můžete to udělat takto:

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());
    }
}
4
LEMUEL ADANE

Od Jeffrey Richter je book CLR přes C # : (Myslím, že to mohou být důvody, proč vlastnosti ještě nejsou přidávány v Javě)

  • Metoda vlastnosti může vyvolat výjimku; přístup k poli nikdy nevrací výjimku.
  • Vlastnost nemůže být předána jako parametr out nebo ref metody; pole může. 
  • Provedení metody vlastnosti může trvat dlouho; přístup k poli vždy dokončí okamžitě. Běžným důvodem použití vlastností je provedení synchronizace vláken, , Která může navždy zastavit vlákno, a proto by vlastnost neměla být použita, pokud je požadována synchronizace vláken. V této situaci je upřednostňována metoda. Také pokud lze ke své třídě přistupovat vzdáleně (například vaše třída je odvozena od System.MarshalByRefObject), volání metody vlastnosti bude velmi pomalé a proto je upřednostňována metoda před majetkem. Podle mého názoru by třídy odvozené od MarshalByRefObject neměly nikdy používat vlastnosti.
  • Pokud je volána vícekrát v řádku, může metoda vlastnosti vrátit jinou hodnotu každý Čas; pole vždy vrátí stejnou hodnotu. Třída System.DateTime má vlastnost Now, která vrací aktuální datum a čas. Při každém dotazu na tuto vlastnost Vrátí jinou hodnotu. Jedná se o chybu a společnost Microsoft si přeje, aby Mohli tuto třídu opravit pomocí metody Now namísto vlastnosti. Vlastnost EnvironmentTickCount je dalším příkladem této chyby.
  • Metoda vlastnosti může způsobit pozorovatelné vedlejší účinky; přístup k poli nikdy neučiní. V jiných slovech By uživatel typu měl být schopen nastavit různé vlastnosti definované typem v Libovolném pořadí, které si zvolí, aniž by si všiml jakéhokoli odlišného chování v typu.
  • Vlastnost metoda může vyžadovat další paměť nebo vrátit odkaz na něco , Který ve skutečnosti není součástí stavu objektu, takže změna vráceného objektu nemá žádný vliv na původní objekt; dotazování pole vždy vrátí odkaz na objekt , u kterého je zaručeno, že bude součástí stavu původního objektu. Práce s majetkem , Který vrací kopii, může být pro vývojáře velmi matoucí a tato charakteristika není často dokumentována.
3
th1rdey3

Většina IDE pro Java automaticky vygeneruje getter a setter kód, pokud chcete. Existuje celá řada různých konvencí a IDE, jako je Eclipse, vám umožní vybrat si ten, který chcete použít, a dokonce vám umožní definovat vlastní.

Eclipse dokonce obsahuje automatizované refactoring, který vám umožní zabalit vlastnost nahoru do getteru a setteru a upraví všechny kódy, které přistupují k vlastnosti přímo, aby bylo možné použít getter a/nebo setter.

Eclipse může samozřejmě pouze modifikovat kód, o kterém ví - jakékoli vnější závislosti, které byste mohli takovým refaktorováním porušit.

3
Bill Michell

Moje zkušenost s Javou není tak vysoká ani proto, aby mě někdo opravil. Ale AIKIK, obecná konvence je psát dvě metody jako je:

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

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

Já jsem jen uvolnit Java 5/6 anotace a anotační procesor, aby to pomohlo.

Podívejte se http://code.google.com/p/javadude/wiki/Annotations

Dokumentace je teď trochu lehká, ale quickref by měl dostat nápad.

V podstatě generuje nadtřídu s getry/settery (a mnoho dalších možností generování kódu).

Vzorová třída může vypadat

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

K dispozici je mnoho dalších vzorků a v generovaném kódu nejsou žádné runtime závislosti.

Pošlete mi e-mail, pokud si to vyzkoušíte a zjistíte, že je to užitečné! - Scott

1

Pokud používáte Eclipse, pak má schopnost automaticky generovat metodu getter a setter pro interní atributy, může to být užitečný a čas šetřící nástroj.

1
TK.

Neexistuje žádné klíčové slovo vlastnosti v Javě (jako byste mohli najít v C #) nejbližší způsob, jak mít 1 Word getter/setter je dělat jako v 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
1
Patrick PIGNOL

Jak již bylo zmíněno pro Eclipse, integrované vývojové prostředí (IDE) může často vytvářet přístupové metody automaticky.

Můžete to také provést pomocí NetBeans. 

Chcete-li pro vaši třídu vytvořit přístupové metody, otevřete soubor třídy, klepněte pravým tlačítkem myši kdekoli v editoru zdrojového kódu a zvolte příkaz Refactor, Encapsulate Fields. Otevře se dialog. Klepněte na tlačítko Vybrat vše a potom na příkaz Refaktor. Voilà,

Hodně štěstí,

0
levteck