Article View: pl.comp.lang.java
Article #153752Re: jak to jest z tymi JavaBeans
From: Arivald
Date: Thu, 03 Jan 2013 21:51
Date: Thu, 03 Jan 2013 21:51
160 lines
5349 bytes
5349 bytes
W dniu 2013-01-03 21:54, Jadalbert pisze:
> W dniu 2013-01-03 21:33, x pisze:
>> W dniu 2013-01-03 09:40, Jadalbert pisze:
>>> problem (czy raczej moja niewiedza) jest taki
>>> Mam program liczący pewne wielkości i, dajmy na
>>> to w uproszczeniu, w
>>> klasie Geom metodę
>>> public double V(double x, double y, double z) {
>>> return x * y * z;
>>> }
>>> gdzieś tam jest to wywoływane:
>>> V_ = Geom.V(2,3,4);
>>> czyli trzeba wstawić trzy argumenty. Wszystko
>>> działa bez zarzutu.
>>> Teraz, z klas liczących chcę zrobić beans'y.
>>> Czyli powinno być tak (opierając się na
>>> powyższym przykładzie):
>>> private double v;
>>> ...
>>> public double getV() {return v};
>>> public void setV(double v) {this.v = v;}
>>>
>>> i tu, zgodnie z konwencją, metoda set ma tylko
>>> jeden argument, a ja
>>> potrzebuję przekazać 3. Jak wybrnąć sensownie z
>>> takiej sytuacji? Osobna
>>> klasa licząca + osobna typu beans? W beans'ie
>>> dodatkowe metody liczące?
>>> Można oczywiście już w implementacji dołożyć
>>> odpowiednie zmienne, ale co
>>> wtedy przekazywać jako argument?
>>> Najchętniej wszystko co dotyczy liczenia i, że
>>> tak powiem, formalnej
>>> struktury beans'ów chciałbym mieć w jednej klasie.
>>
>> Konwencja JavaBeans ma zastosowanie w przypadku
>> klas, których obiekty mają jakieś "pola" lub
>> "własności". W przypadku klasy Geom to nie zachodzi.
>>
>> Czy jest jakiś konkretny powód, dla którego chcesz
>> zastosować JavaBeans ?
>>
>> Możesz oczywiście wykonać swoje obliczenie w ten
>> sposób:
>>
>> Geom g = new Geom();
>> g.setX(2);
>> g.setY(3);
>> g.setZ(4);
>> println(g.getV());
>>
Zakładając że Geom ma liczyć coś dla jakichś obiektów (tu obiekt
'figura'), można by to zrobić tak:
println(new Geom(figura).getV());
albo zrobić Geom klasą statyczną (a dokładniej jej funkcję getV):
println(Geom.getV(figura));
Ostatnia wersja wydaje się być najoptymalniejsza, bo nie tworzy obiektu
tymczasowego.
>> ale to jest po prostu bez sensu.
>>
>> Pozdrawiam,
>> Marcin Jaskolski
> W klasie Geom rzeczywiście nie ma to sensu ale to tylko prosty przykład.
> Inne klasy mają własności.
> Nie mam dużego doświadczenia w javie, ale pamiętam, że kiedyś czytałem,
> że pisze się jakby dwie klasy. Jedna to typowy beans z polami np. V_, a
> druga to klasa licząca to V i nie będąca beansem.
> i wtedy będzie 1.setV_(2.V);
> tak w uproszczeniu rzecz jasna.
> Ale jestem raz leniwy, a dwa nie wiem czy to aby na pewno jest sensowne
> i poprawne.
To raczej miało tak wyglądać:
klasa 1 to POJO (http://pl.wikipedia.org/wiki/Plain_Old_Java_Object),
ergo nie ma żadnego przetwarzania, tylko dane. Może być beanem (bez
serializacji).
do tego druga klasa (lub kolekcja klas) realizująca jakieś przetwarzanie.
pełny przykład:
public class First {
private double x;
private double y;
private double z;
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public double getZ() {
return z;
}
public void setZ(double z) {
this.z = z;
}
}
public class Second {
private First first;
public Second(First first) {
this.first = first;
}
public double getV() {
return first.getX() * first.getY() * first.getZ();
}
}
i użycie:
First f = something.getFirst(); //skądś tam się bierz
Second sec = new Second(f);
double v = sec.getV();
lub nawet
double v = new Second(something.getFirst()).getV();
W innej wersji, klasa Second jest statyczna (coś jak namespace z C++),
dostarcza obliczeń bez konieczności tworzenia instancji.
public class Second {
public static double getV(First first) {
return first.getX() * first.getY() * first.getZ();
}
}
Wtedy używa się jej tak:
double v = Second.getV(something.getFirst());
Wszystko zależy od potrzeb.
--
Arivald
Technical Details
Message-ID:
<kc4uho$urh$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<50e54418$0$1298$65785112@news.neostrada.pl> <50e5eb16$0$26696$65785112@news.neostrada.pl> <50e5eff0$0$1295$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.cyf-kr.edu.pl!news.nask.pl!news.nask.org.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <NOSPAMarivald@interia.pl> Newsgroups: pl.comp.lang.java Subject: Re: jak to jest z tymi JavaBeans Date: Thu, 03 Jan 2013 22:51:22 +0100 Organization: Dialog Net Lines: 161 Message-ID: <kc4uho$urh$1@news.dialog.net.pl> References: <50e54418$0$1298$65785112@news.neostrada.pl> <50e5eb16$0$26696$65785112@news.neostrada.pl> <50e5eff0$0$1295$65785112@news.neostrada.pl> NNTP-Posting-Host: dynamic-78-8-99-8.ssp.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1357249912 31601 78.8.99.8 (3 Jan 2013 21:51:52 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Thu, 3 Jan 2013 21:51:52 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20121128 Thunderbird/18.0 In-Reply-To: <50e5eff0$0$1295$65785112@news.neostrada.pl> X-Antivirus: avast! (VPS 130103-0, 2013-01-03), Outbound message X-Antivirus-Status: Clean Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit