Törmäsin tässä aika huvittavaan pätkään tonkiessani nettiä ihan muista asioista. Cay Horstmannin sivuilla (näyttää kirjoittaneen useita kirjoja Javasta jne eli tietänee sentään jotain, toisaalta on opetusvirassa) on linkki hänen oppilaansa tekemään viritelmään jolla saisi propertyt Javaan. C#:ssahan moiset ovat oikein mukavia. Hän kylläkin mainitsee tästä viritelmästä: "Like C#, just better." Ja toivoo että Java 7 sisältäisi nämä. Katsotaanpa miten ovat parempia.
Ehdottavat seuraavaa muotoa:
@Property
private String name;
Joka sitten tuottaisi tällaisen Java-koodin:
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Ok. Eli siis parempaa kuin C# lienee se, että C#:lla joutuisi tekemään näin:
private string _name;
public string Name()
{
get { return _name; }
set { _name = value; }
}
Eli hieman vaikeampaa, mutta helpompaa kuin Javassa nykyään. Mutta jos sitten mietitään mikä se pointti on: propertyjen idea on suojata dataa ja hallita miten sitä käsitellään. Heidän esittämänsä yksinkertainen esimerkki on järjetön. Vaikka kuinka olioinnin paradigmat sanoisivat, ettei ikinä saa päästää suoraan kiinni muuttujiin, minä en sitä syö. Jos kerran saa lukea ja kirjoittaa mitä tahansa, miksi tehdä toimintaa hidastavat getterit ja setterit? Ja kun heidän esimerkkinsä todellakin vain tekee tuon!
Myöskin ihmetyttää miten tuo heidän makroviritelmänsä on parempi kuin C# kun sillä ei näytä saavan tehtyä edes tällaista perustoimintoa:
private int _length;
public int Length()
{
get { return _length; }
set
{
if (value < 0)
{
throw new ArgumentException("Value cannot be negative");
}
}
}
Saati sitten vaikkapa metodikutsuja tiedon päivittämiseen kantaan tai laskentarutiinia joka palauttaa sisäisen metrisen mitan maileina tai...
Mutta tokihan tällaisia ei kukaan kaipaa, joten heidän esittämänsä propertyt riittävät. Vai pitäisiköhän heidän miettiä hieman uudestaan miten homma pitäisi tehdä?
Argh. Juuri huomasin että tyyppi on todellakin käsittänyt asiat ihan väärin:
Properties are useful for specifying, that is, marking certain aspects of the entity that are to be highlighted to a client of this entity, and in doing so, allowing this client to deduce special behavior from these markings. For example, a Widget class can define properties to represent its visual aspects, which can later be used by a GUI builder tool.
Tuota... Ehkä kannattaisi laajentaa maailmankatsomusta. Kyllä niitä noihinkin voi käyttää (ja C#:ssa on sitten vielä attribuutit joilla määritellään mukavia lisäjuttuja), mutta kyllä niillä on ihan tärkeämpiä perustoiminteita kuten juurikin datan eheyden varmistus.