Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

potrebno teorijsko pojasnjenje

[es] :: Java :: potrebno teorijsko pojasnjenje

[ Pregleda: 2742 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon potrebno teorijsko pojasnjenje27.08.2013. u 23:15 - pre 128 meseci
Ako je moguca pomoc.
Radi se o sledecem:
Kako je moguce koristiti metode nekog interfejsa ako pre toga nisam implementirao te metode.

Konkretno, iz Oraclovog tutorijala ucim deo vezan za java.nio.file paket. Interfejs java.nio.file.Path ima gomilu metoda. U primerima se koriste te metode.
Ono sto ja znam o interfejsima je da ne mogu koristiti metode nekog interfejsa ako ih pre toga nisam implementirao u nekoj klasi.
Sta sam to propustio da naucim vezano za interfejse?

Evo i jedan primer:

Code:
Path p1 = Paths.get("/home/logfile");
System.out.format("%s%n", p1.toUri());


Gde je to implementiran metod toUri()?
 
Odgovor na temu

blekmor
fax
fax

Član broj: 309532
Poruke: 55
*.dynamic.kdsinter.net.



+30 Profil

icon Re: potrebno teorijsko pojasnjenje28.08.2013. u 00:50 - pre 128 meseci
Propustio si dinamicko vezivanje i polimorfizme. To su jako bitne osobine Java-e kao objektno orjentisanog programskog jezika.
Ukratko
Ukoliko imas interfejs A i implementiras taj interfejs u klasi B - sledeca stvar je dozvoljena

Code:

public interface A {
  public void foo();
}

public class B implements A {
  public void foo(){
    // uradi nesto
  }

  public void bar(){
   // metod koji nije definisan u interfejsu
  }
}

// sledeca stvar je dozvoljena
A a = new B();
// sada koristis objekat a kao tip A zato sto je tako inicijalizovan, npr
a.foo();
// ali u isto vrijeme ga mozes koristiti i kao tip B, zato sto je tako instanciran, samo sto ga moras kastovati kako bi Java znala o cemu se radi, npr
(B)a.bar();



Znaci objekat se moze inicijalizovati kao tip A ali se mora instancirati kao tip B (ili bilo koji drugi tip ako ga njegova klasa implementira)

Konkretno u tvom slucaju zelis objekat tipa Path. Dobices ga tako sto ces pozvati staticki metod klase Paths koja vraca tip Path
http://docs.oracle.com/javase/7/docs/api/java/nio/file/Paths.html

Znaci klasa Paths ima metod koji napravi objekat tipa Path ali tako sto inicijalizuje klasu koja ga implementira.

Sada cu napisati otprilike kako su oni to mozda uradili (cisto da ti bude jasnije)

Code:

// interfejs Path, kasnije ces koristiti ovaj tip
public interface Path{
 //metod koji si ti naveo u primjeru
 public String toUri();

 // svi metodi koji se nalaze u ovom interfejsu ...
}

// da bi koristio interfejs Path moras ga implementirati u nekoj klasi, recimo da ga implementiras u klasi PathImpl
public class PathImpl implements Path{
 public String toUri(){
  // implementacija ovog metoda
 }

 // implementacija svih ostalih metoda iz Path interfejsa
}

// sada pravim klasu Paths koja ce imati metod koji ce da za tebe instancira objekat tipa Path i proslijediti ga
public final class Paths{
 public static Path get(String uri){
  Path p = new PathImpl();
  return p;
 }
}

//i sada kada ti kazes
Path p1 = Paths.get("uri");
// dobijes objekat tipa Path koji je instanciran u metodu get i prosledjen tebi na koriscenje i mozes da kazes
System.out.println(p1.toUri());


Nadam se da ti je sada jasnije. Obavezno dobro izuci polimorfizme i dinamicko vezivanje.
Pisi ukoliko imas jos pitanja
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: potrebno teorijsko pojasnjenje28.08.2013. u 10:39 - pre 128 meseci
To objasnjenje je upravo ono sto mi je trebalo. Hvala ;)

Ako moze jos jedno pitanje:

U primeru sto sam ja naveo toUri() metod interfejsa Path je implementiran na nacin na koji si opisao.
Ako, pak, uzmem interfejs ActionListener moracu sam da implementiram njegov metod actionPerformed(ActionEvenet event).

Kako je moguce da iz API dokumentacije uocim koji su metodi nekog interfejsa implementirani (na nacin na koji si opisao), a koje metode ja sam moram da implementiram?
 
Odgovor na temu

blekmor
fax
fax

Član broj: 309532
Poruke: 55
*.teol.net.



+30 Profil

icon Re: potrebno teorijsko pojasnjenje28.08.2013. u 18:00 - pre 128 meseci
Ako imas neki interfejs kojeg implementiras u nekoj klasi, u toj klasi moras implementirati sve metode tog interfejsa. Moj primjer je samo demonstracija polimorfizma i dinamickog vezivanja.

Pogledaj na primjer sledeci link
http://docs.oracle.com/javase/7/docs/api/java/lang/Iterable.html
Vidices listu klasa (All Known Implementing Classes:) koje implementiraju taj interfejs, samim tim i sve njegove metode.

Mada nemoj da te ovo zbuni. To sto postoji neka implementacija nekog intefejsa ne znaci da ga mozes iskoristiti u svakoj situaciji.
Npr postoji nekoliko standardnih implementacija interfejsa List(intefejs koji predstavlja listu), i svaka od tih implementacija je pogodno za odredjene situacije, ali takodje mozes doci u situaciju da ti ni jedna postojeca implementacija ne odgovara, pa ces morati sam da pravis svoju implementaciju.
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: potrebno teorijsko pojasnjenje28.08.2013. u 23:48 - pre 128 meseci
Tek sada kada sam procitao tvoj odgovor shvatio sam da sam pogresno postavio pitanje. Sve mi je to jasno sto si napisao, ali nije me to zanimalo.
Ono sto sam zeleo da pitam jeste kako ti znas iz API dokumentacije da su metodi nekog interfejsa implementirani u nekoj klasi, i da se ti metodi mogu slobodno koristiti bez da ih moram sam implementirati? Nije problem u tome da li trebaju svi biti implementirani, nego kako da znam da su vec negde uopste implementirani?
Uzmimo primer sa pocetka, interfejs Path. Kako ti znas citajuci API dokumentaciju da su metode tog interfejsa implementirane u nekoj klasi? Ako bi pretpostavili da tvoja klasa PathImpl stvarno postoji, kako bi ja to mogao znati iz API dokumentacije? Konkretno, u opisu tog interfejsa, nemas taj deo All Known Implementing Classes:

Problem sa kojim se ja susrecem jeste sledeci: kada naletim na neki interfejs i pogledam njegov opis u dokumentaciji, na osnovu cega bi ja mogao znati da su metodi tog interfejsa vec implementirani u nekoj klasi, pa da mogu slobodno da ih koristim, bez da ja moram prethodno da ih sam implementiram.
 
Odgovor na temu

blekmor
fax
fax

Član broj: 309532
Poruke: 55
*.teol.net.



+30 Profil

icon Re: potrebno teorijsko pojasnjenje29.08.2013. u 18:26 - pre 128 meseci
Ako detaljno procitas dokumentaciju , uvjek mozes naci gdje i kako je odredjeni interfejs implementiran (ukoliko je implementiran). Nece ti uvjek biti napisana lista klasa, ali uvjek imas negdje objasnjenje gdje i kako inicijalizujes objekte tog tipa.
Ako ne mozes naci u dokumentaciji, tu je google.
Ako ne mozes naci ni tamo, implementiras ga sam.
Pozdrav
 
Odgovor na temu

megabaja
duvach guma na kontejnerima
Zemun

Član broj: 71657
Poruke: 7
95.141.31.*



+1 Profil

icon Re: potrebno teorijsko pojasnjenje29.08.2013. u 20:38 - pre 128 meseci
Ako zelis da saznas koja klasa je instancirana u prvom primeru to radis na sledeci nacin

Code:

Path myPath = Paths.get("/Users");
System.out.println(myPath.getClass());


U slucaju da zelis da saznas potklase neke klase, e pa to je vec malo teze. Sta bih ja uradio je sledece (mala napomena - nisam ovo pokusavao, samo nabacujem ideje):

1. raspakovao rt.jar iz jre/lib direktorijuma.
2. napravio program koji iterira kroz sve .class fajlove
3. za svaki fajl dobio Class objekat koristeci
Code:
Class.forName("BlaTruc")

4. proverio da li je u pitanju nasledjivanje sa
Code:
Class.forName("bla").isAssignableFrom(Class.forName("truc"));


Takodje, mozes da pokusas da uradis tekstualnu pretragu sors koda javinih fajlova (jdk dolazi sa sors kodom, jre ne dolazi).

Na kraju, ja ne volim da budem sam svoj majstor ako znam da je neko negde vec uradio posao verovatno bolje nego sto cu ga ja uraditi. U to ime, baci pogled na ovaj projekat. [url]https://code.google.com/p/reflections/[/url].

Srecno
 
Odgovor na temu

megabaja
duvach guma na kontejnerima
Zemun

Član broj: 71657
Poruke: 7
95.141.31.*



+1 Profil

icon Re: potrebno teorijsko pojasnjenje29.08.2013. u 22:03 - pre 128 meseci
E da. Najlaksi nacin. Ako koristis eclipse i zelis da znas gde je sve implementirana metoda nekog interfejsa/abstraktna metoda udjes u sors klase pritisnes ctrl i predjes kursorom preko metode. U padajucem meniju izaberes 'open implementation' i izaberes implementaciju koja ti odgovara. I cao zdravo :)
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: potrebno teorijsko pojasnjenje30.08.2013. u 20:53 - pre 128 meseci
Ok ljudi, hvala za ideje i objasnjenja. Samo da vam opisem do kakvih sam ja zakljucaka dosao, posto sam pokrenuo temu na jos jednom mestu.
Ono sto je mene interesovalo, jeste kako ja iz API dokumentacije na brzinu da proverim da li su metode nekog interfejsa implementirane. Ne radi se ovde o tome KAKO SU implementirane, nego DA LI SU UOPSTE implementirane.
Jer kada meni neko da neki interfejs, prva stvar koja meni padne na pamet, jeste da napisem klasu koja implementira metode tog interfejsa. Ali zasto bi ja implementirao te metode, ako je to vec neko uradio za mene. A opet, kako ja to da znam, jer kada odem u API dokumentaciju da pogledam opis tog interfejsa, nigde ne pise da su metode implementirane. Iz nekog razloga, to se podrazumeva.
Retko ko moze da da odgovor na ovo pitanje, uglavnom se sve svede na to da ti ljudi pocnu opisivati sta su interfejsi, sta se sa njima moze raditi i cemu sluze. Sto mene uopste ne zanima, u ovom konkretnom slucaju.
Zamislite situaciju da ja napisem neki interfejs sa nekim metodama, i opisem sve to u API dokumentaciji, i prosledim nekome od vas taj interfejs. Kako cete vi znati da li sam ja implementirao te metode, ili vi sami morate pisati tu implementaciju, citajuci samo dokumentaciju koju sam ja prosledio? Sta bi ja to trebao da napisem u dokumentaciji pa da vama odma bude jasno da su metode implementirane, bez da se mucite istrazujuci moj source code ili pisuci neke svoje programe koji koriste refleksiju ili sta vec.

Po svoj prilici, za najveci broj interfejsa u API dokumentaciji metodi su implementirani. Ako pak nisu implementirani radi se o specificnim interfejsima koje zbog svoje prirode sami morate implementirati (kao sto su interfejsi za EventHandling), posto kod njih implementacija zavisi od toga kako ce se ponasati vas program.
 
Odgovor na temu

megabaja
duvach guma na kontejnerima
Zemun

Član broj: 71657
Poruke: 7
95.141.31.*



+1 Profil

icon Re: potrebno teorijsko pojasnjenje30.08.2013. u 21:08 - pre 128 meseci
Pazi, ja do odgovora na tvoje pitajne stizem sa tri klika u eclipsu, ako ti je ovo najveci problem sa kojim si se sreo onda nisi ni svestan koliko srece imas :D
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: potrebno teorijsko pojasnjenje30.08.2013. u 21:11 - pre 128 meseci
Ima tu, za mene jos jedan problem koji uocavam. Opisacu vam to na primeru koji sam izdvojio na pocetku.
Citajuci oracle-ov tutorijal o File I/O. Oni na pocetku tutoijala pomenu da je java.nio.file.Path entry point za taj paket. I sada recimo vi odma odete u API dokumentaciju i pogledate opis tog interfejsa. U opisu tog interfejsa, vama nigde ne pise kako vi mozete dobiti objekate na kojima bi koristili metode interfejsa Path. Pazite, u tutorijalu vam to napomenu, ali u API dokumentaciji ne. Sta ja sada treba da radim, da procitam opis za sve klase u paketu java.nio.file ne bi li nasao onu klasu koja je sposobna da vrati objekte na kojima mogu koristiti metode interfejsa Path?
Ako odem prvo u Path interfejs, nista u tom interfejsu ne ukazuje da ja treba u sledecem koraku da idem ka klasi Paths, ne bi li dobio objekte koji mi trebaju.
Ako pak odem prvo u klasu Paths, onda proucavanjem metoda, koje objekte vracaju, mogu naslutiti da mi je sledeca destinacija interfejs Path.
Ako pocnem da proucavam neki paket, kako ja da znam u koju klasu/interfejs treba prvo da idem, ne bi li tu dobio ideju kuda dalje da se krecem u API dokumentaciji?
 
Odgovor na temu

velimzo
...

Član broj: 278420
Poruke: 62
*.dynamic.isp.telekom.rs.



+1 Profil

icon Re: potrebno teorijsko pojasnjenje30.08.2013. u 21:15 - pre 128 meseci
@megabaja
Ok, razumeo sam.
Ali ja forsiram ovu temu, cak i po cenu da ispadnem glup, zato sto mi se tu nisu sve kockice u glavi slozile vezano opis interfejsa u API dokumentaciji.
Mogao sam ja da predjem preko ovog njihovog objasnjenja, bez ikakvog zamajavanja da proniknem u sustinu problema, i da sve prihvatim zdravo za gotovo, onako kako su oni opisali u tutorijalu. Ali imam osecaj kao da ce me slicna dilema sacekati opet u buducnosti u nekoj drugoj situaciji.
 
Odgovor na temu

blekmor
fax
fax

Član broj: 309532
Poruke: 55
*.teol.net.



+30 Profil

icon Re: potrebno teorijsko pojasnjenje04.09.2013. u 01:01 - pre 128 meseci
Nije ti sve uvjek dato na jednom mjestu. Moras malo da se dovijas, gledas i ucis sa vise izvora.
API i ne treba da ti kaze te stvari. API ce ti opisati interfejs/klasu, sta radi i kako radi. Cesto ces biti uskracen za (detaljniji) opis kako konkretno da iskoristis to u svome programu, zato sto bi onda API bio ogroman i nepraktican, a nikada ne bi obuhvatio sve odgovore. Znaci odgovor na tvoje pitanje je - nekada ti je jasno dato u API-ju, nekada se moras snalaziti i traziti dalje, nekada nema implementacije, a sto je najvaznije : ako je interfejs implementiran, ne znaci da ta implementacija moze da ti koristi u tvom konkretnom problemu/programu

Nemoj da se uvrijedis, ali vidim da si jos "zelen" sto se tice objektno orjentisanog programiranja, pa ni ne razumijes zasto ti "iskusniji" ne daju odgovor kakav trazis. Kad shvatis (ali zaista shvatis) koncepte oop-a razumices i zasto je API napisan tako kako je napisa i kako da ga koristis. Obrati paznju na tutorijale i semplove(ako postoje). Tamo mozes naci primjere kako se sta koristi.
 
Odgovor na temu

[es] :: Java :: potrebno teorijsko pojasnjenje

[ Pregleda: 2742 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.