🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #153752

Re: jak to jest z tymi JavaBeans

#153752
From: Arivald
Date: Thu, 03 Jan 2013 21:51
160 lines
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-mail
References: <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