www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it ProgrammazioneconJava Incapsulamento,overloading ecostruttori INCAPSULAMENTO Metodidiistanza,incapsulamento,overloadingecostruttori 2 2 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Incapsulamento Lincapsulamentopermettedisepararelinterfaccia dallimplementazione linterfaccia contienecichevisibileallesterno(cioachiutilizzalaclasseincapsulata) limplementazione tuttiidettagliimplementativichesivogliononascondereachiutilizza laclasseincapsulata Chevantagginelleffettuareincapsulamento? Riusodelcodice Unprogrammatorecheusaunmetodochestatodefinitodaaltrinonnecessitadiconoscerei dettagliimplementativi(ilbody!) Ilprogrammatoredevosolo conoscerecosa ilmetodofaenoncome lofa esempio:voiutilizzateilmetodoSavi t chI n. r eadI nt ( ) sapendocheleggedainputstandardun valoreintero,manonvisietemaichiesticomelofa(enonviinteressa!!!!) Possibilitdimodificarelimplementazione(adesempioperrenderelaclassepi efficiente)senzacheleclassicheutilizzanoquellamodificataseneaccorgano miaccorgochelimplementazionedelmetodolacuiinterfacciacercaCarattereutilizzaun algoritmotroppoinefficiente,lomodificolasciandoinalteratalinterfaccia Statodelloggettosempreconsistente incapsulogliattributiepermettolaloromodificaattraversometodicheappartengono allinterfacciaecheeffettuanoicontrolli Metodidiistanza,incapsulamento,overloadingecostruttori 3 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempioincuicambiolimplementazione publ i c cl ass Li neaTel ef oni ca{ publ i c St r i ng numer o; publ i c St r i ng r est i t ui sci Pr ef i ssoI nt er nazi onal e( ) { St r i ng nazi one = numer o. subst r i ng( 0, 4) ; r et ur n nazi one; } } Inblucicheappartieneallinterfaccia Innerocicheapprtieneallimplementazione publ i c cl ass Li neaTel ef oni ca{ publ i c St r i ng numer o; publ i c St r i ng r est i t ui sci Pr ef i ssoI nt er nazi onal e( ) { St r i ng nazi one = " " ; f or ( i nt i =0; i <4; i ++) { nazi one = nazi one + numer o. char At ( i ) ; } r et ur n nazi one; } } tuttocichedichiaro public appartieneallinterfaccia Li neaTel efoni ca + numero: String + restrituisciPrefissoInternazionale() : String Li neaTel efoni ca + numero: String + restrituisciPrefissoInternazionale() : String Metodidiistanza,incapsulamento,overloadingecostruttori 4 3 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempio LaclasseSemafororappresentaunsemaforodiunincrocio stradale publ i c cl ass Semaf or o{ publ i c St r i ng col or e; publ i c voi d cambi aCol or e( ) { i f ( col or e. equal s( " r osso") ) { col or e = " ver de" ; } el se { i f ( col or e. equal s( " ver de") ) { col or e = " gi al l o" ; } el se { i f ( col or e. equal s( " gi al l o" ) ) { col or e = " r osso" ; } } } } } Semaforo + colore: String + cambiaColore() : void Semaforo + colore: String + cambiaColore() : void Metodidiistanza,incapsulamento,overloadingecostruttori 5 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempio LimplementazionediSemaforoincapsulata? PossomodificarelimplementazionesenzachelaclasseTestSemaforodebba moficarla? No!CambioiltipodicoloredaStringainteilmainnonfunzionapiu! PossoignorareidettagliimplementativiinfasediutilizzodellaclasseSemaforo? No!Avendolapossibilitdiaccedereacolore,devosaperedichetipo Loggettos1rimanesempreinunostatoconsistente? No!Possoassegnareilcoloreblusenzaalcunproblema.Masimaivistounsemaforo blu? publ i c cl ass Semaf or o{ publ i c st at i c voi d mai n( St r i ng a[ ] ) { Semaf or o s1 = new Semaf or o( ) ; s1. col or e = " r osso" ; s1. cambi aCol or e( ) ; s1. cambi aCol or e( ) ; s1. col or e = " bl u" ; / / Er r or e } } Metodidiistanza,incapsulamento,overloadingecostruttori 6 4 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Realizzarelincapsulamento Distinguerefrainterfacciaeimplementazione Gliattributidiistanzasonoundettaglioimplementativo,ilsignificato datodalleoperazionichelemanipolano esempio:IlsignificatodiunSemaforonondipendedalfattochelattributo coloresiaditipoStringoint,madalfunzionamentodelmetodocambiaColore Soluzione:modificatoridivisibilitperimpedireachiusaoggetti accedadirettamenteagliattributiinscrittura esempio:impedireachiusaoggettiSemaforodiaccedereall'attributo colore,mettendoadisposizionesoloilmetodocambiaColore Permetteresolostativalidiperglioggetti Lostatodeglioggettideveconteneresemprevalorivalidi esempio:blunonunvalorevalidoperilcolorediunSemaforo Soluzione:controllaretuttelemodifichedellostatoattraversometodi Metodidiistanza,incapsulamento,overloadingecostruttori 7 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Modificatoripublic eprivate Nonconsideratabuonanormaprogrammativadichiararegli attributidiistanzapubl i c! nondevonofarpartedellinterfacciadellaclasse Taliattributidevonoesseredichiaratipr i vat e! devonoappartenereallimplementazione (sideveoperareancheper loroincapsulamento) Sesiutilizzailmodificatorepubl i c ognialtraclassepu accedereinmanieradirettaallattributodiistanzaequindi modificarlodirettamente! Esempio: Sorgente (Metodi_03) Automobi l e + velocitaCorrente: int + proprietario: String + toString() : String Automobi l e + velocitaCorrente: int + proprietario: String + toString() : String Metodidiistanza,incapsulamento,overloadingecostruttori 8 5 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Gliattributiprivate Dichiarareunattributodistanzaprivatecomportacheaccessibile esclusivamenteallinternodellaclasseincuidefinito Esempiocorretto: Sorgente(Metodi_04) Comegivistopossibiledichiarareancheimetodiprivate talimetodisonometodidiserviziochevengonoinvocatidaaltri esempio: cal col aBase( ) ecal col aAl t ezza( ) sonometodidiservizioperla classeRettangolocheesportasolometodiperilcalcolodellareaedel perimetro Selanormadichiararegliattributidistanzapr i vat e,come faccioaldifuoridellaclasseadaccedereagliattributistessi? Automobi l e - velocitaCorrente: int - proprietario: String + setVelocitaCorrente(velocita :int) : void + setProprietario(proprietario :String) : void + toString() : String Automobi l e - velocitaCorrente: int - proprietario: String + setVelocitaCorrente(velocita :int) : void + setProprietario(proprietario :String) : void + toString() : String Metodidiistanza,incapsulamento,overloadingecostruttori 9 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Metodidiincapsulamentooaccesso Dichiararegliattributidiistanzapr i vat e obbligaachidefiniscala classedidotarladimetodichepermettonolaccessoagliattributi stessi Unmetododiincapsulamentosemplicementeunmetodoche permetteadunaltraclassedileggereoimpostareilvalorediun attributodiistanzadichiaratoprivate Talimetodidevonoappartenereallinterfacciapubblicadellaclasse! Quandolattributopuessereacceduto siainscritturacheinletturaoccorrerdotarelaclassedi2metodi soloinletturaoccorrerdotarelaclassedi1metodo soloinscritturaoccorrerdotarelaclassedi1metodo Metodidiistanza,incapsulamento,overloadingecostruttori 10 6 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Namingedesempio Imetodidiincapsulamentoseguonopiomenolaseguente convenzione: inmodifica:set NomeAt t r i but o inlettura:get NomeAt t r i but o Esempio: Sorgente(Metodi_05) Automobi l e - velocitaCorrente: int - proprietario: String + setVelocitaCorrente(velocita :int) : void + setProprietario(proprietario :String) : void + toString() : String + getVelocita() : int + getProprietario() : String Automobi l e - velocitaCorrente: int - proprietario: String + setVelocitaCorrente(velocita :int) : void + setProprietario(proprietario :String) : void + toString() : String + getVelocita() : int + getProprietario() : String Metodidiistanza,incapsulamento,overloadingecostruttori 11 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Lakeywordthis NellesempiodiAutomobile,nelmetodoset Pr opr i et ar i o( St r i ng pr opr i et ar i o) hoambiguitnellaseguenteistruzione: pr opr i et ar i o = pr opr i et ar i o; Devoesplicitarequaledelle2variabilisiriferisceallattributodiistanza: t hi s. pr opr i et ar i o = pr opr i et ar i o; t hi s vuoldirelistanzacorrente publ i c voi d set Pr opr i et ar i o( St r i ng pr opr i et ar i o) { t hi s. pr opr i et ar i o = pr opr i et ar i o; } Metodidiistanza,incapsulamento,overloadingecostruttori 12 7 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Namingrispettatasempre? Nonsempreconvenienteutilizzarelaconvenzione Siutilizzaesclusivamentequandohasenso! Guardiamoquestoesempio: Luce - boolean accesa + void accendi() + void spegni() + boolean isAccesa() Luce - boolean accesa + void setAccesa(boolean valore) + boolean getAccesa() Metodidiistanza,incapsulamento,overloadingecostruttori 13 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Riassumendo Quandosidefinisconoclassiusaresempreleseguentiregole: 1. inseriresempreuncommentointestaallaclassechespecificalastrazioneche rappresenta.Usareicommentipergenerareladocumentazione 2. dichiararetuttigliattributidiistanzaappartenentiallimplementazione (modificatorepr i vat e) 3. forniretuttigliopportunimetodidiincapsulamentoperleggereemodificare gliattributidiistanza(appartenentiquindiallinterfacciapubblica, modificatorepubl i c) 4. forniretuttiimetodidellinterfacciapubblica(modificatorepubl i c) 5. documentaretuttiimetodiinserendoleprecondizionielepostcondizioni 6. dichiarareimetodidiservizioappartenentiallimplementazione(modificatore pr i vat e) 7. inseriresemprenelladefinizionediclasseilmetodot oSt r i ng( ) Metodidiistanza,incapsulamento,overloadingecostruttori 14 8 OVERLOADING Metodidiistanza,incapsulamento,overloadingecostruttori 15 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Overloading Definizioneformale: operareoverloading diunmetodovuoldireassegnarelostessonome adueopidefinizionidifferentiallinternodellastessaclasse ComefaJavaasaperequaledefinizionedeveeseguire? Javadeterminaladefinizionecorrettasullabasedelnumeroedeltipo diargomenti Quandoeperchsifaoverloading?Nonpisemplice definiremetodiconnomidiversi? quandodiversimetodisemanticamentefannolastessacosamacon parametriiningressodiversi.Nonhasensomodificareilnome Metodidiistanza,incapsulamento,overloadingecostruttori 16 9 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempio LaclasseLi neaTel ef oni ca fornisceancheunmetodoche permettedirichiamarelultimonumeroselezionato ladefinizionevamodificatainserendofragliattributidiistanzaanche unastringachememorizzalultimonumerocomposto Sorgente (Metodi_06) Li neaTel efoni ca - numero: String - prefissoNazionale: String - prefissoInternazionale: String - ultimoNumeroComposto: String + isInterurbana(String) : boolean + componiNumero(String) : void + componiNumero() : void Li neaTel efoni ca - numero: String - prefissoNazionale: String - prefissoInternazionale: String - ultimoNumeroComposto: String + isInterurbana(String) : boolean + componiNumero(String) : void + componiNumero() : void Metodidiistanza,incapsulamento,overloadingecostruttori 17 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Ancorasulloverloading Nonpossibileoverloadareunmetodomodificandoesclusivamenteil tipodiritorno! esempio: publ i c String t oSt r i ng( ) { . . . } publ i c void t oSt r i ng( ) { . . . } Metodidiistanza,incapsulamento,overloadingecostruttori 18 10 COSTRUTTORI Metodidiistanza,incapsulamento,overloadingecostruttori 19 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Linizializzazionedeglioggetti Quandosicreaunoggettobuonanormainizializzareivalori degliattributi Comedetto,gliattributivengonoinizializzatiavalorididefault Nondettochetalivalorisianoeffettivamentequellicorretti. Comefaccioamodificarli? utilizzoimetodidiincapsulamento! possibilepercheleoperazionidiinizializzazione delloggettovadanooltreallapuraassegnazionedivalori inizialipergliattributi sedevocostruireuninterfacciagrafica,vogliochetutteleoperazione dicostruzionevenganofattenelmomentoincuiistanziologgetto Metodidiistanza,incapsulamento,overloadingecostruttori 20 11 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Icostruttori Uncostruttoreunospecialetipodimetododestinatoad effettuareleinizializzazionidelloggetto Finoadorasisonocreatioggettigraziealasequentesintassi: Talesintassicrealoggettoedinizializzagliattributidiistanzaa valorididefault(chenonnecessariamentesonoquelli desiderati!) Usandoicostruttoripossibilecreareoggettiinizializzandolia valoridesiderati Ilcostruttoreunmetodospecialechevieneinvocatonel momentoincuivienecreatounoggetto(esoloinquel momento!) Sintassi: new NomeCl asse( ) Esempio: new Aut omobi l e( ) Metodidiistanza,incapsulamento,overloadingecostruttori 21 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Lasintassi Comeunmetodo,uncostruttoreeseguetutteleistruzioni specificatenellasuadefinizione quandosiscriveuncostruttore,occorreperoricordarsicheilsuo scopoquellodieseguireleazioninecessarieallinizializzzione delloggetto esempio: laclasseLineaTelefonicapossiedeunaseriedimetodichehannocome precondizionelinizializzazionedellalineastessa:sarebbeopportuno,al postodiinvocarei3metodidiincapsulamento,inizializzare opportunamenteloggettolineaconivaloriperi3attributi Sintassi: publ i c NomeCl asse( [ l i st a par amet r i f or mal i ] ) { / / i ni zi al i zzazi oni } NomeCl asse r ef = new NomeCl asse( [ ar goment i ] ) Metodidiistanza,incapsulamento,overloadingecostruttori 22 12 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Conlavecchiamodalit publ i c cl ass Aut omobi l e { pr i vat e i nt vel oci t aCor r ent e; pr i vat e St r i ng pr opr i et ar i o; publ i c voi d set Vel ci t a( i nt v) { vel oci t aCor r ent e = v; } publ i c voi d set Pr opr i et ar i o( St r i ng p) { pr opr i et ar i o = p; } . . . } publ i c cl ass Test Aut o { publ i c st at i c voi d mai n( St r i ng ar [ ] ) { / / Vogl i o cr ear e l aut o di Paper i no con vel oci t 100 Automobile a = new Automobile(); a.setVelocita(100); a.setProprietario(Paperino); } } Metodidiistanza,incapsulamento,overloadingecostruttori 23 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Conilcostruttore... publ i c cl ass Aut omobi l e { pr i vat e i nt vel oci t aCor r ent e; pr i vat e St r i ng pr opr i et ar i o; publ i c Aut omobi l e( i nt vel oci t aC, St r i ng pr opr i et ar i o) { vel oci t aCor r ent e = vel oci t aC; t hi s. pr opr i et ar i o = pr opr i et ar i o; } publ i c voi d set Vel ci t a( i nt v) { vel oci t aCor r ent e = v; } publ i c voi d set Pr opr i et ar i o( St r i ng p) { pr opr i et ar i o = p; } . . . } publ i c cl ass Test Aut o { publ i c st at i c voi d mai n( St r i ng ar [ ] ) { / / Vogl i o cr ear e l aut o di Paper i no con vel oci t 100 Automobile a = new Automobile(100, Paperino); } } Metodidiistanza,incapsulamento,overloadingecostruttori 24 13 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it ...Sehovincolisuivalori publ i c cl ass Aut omobi l e { pr i vat e i nt vel oci t aCor r ent e; pr i vat e St r i ng pr opr i et ar i o; publ i c Aut omobi l e( i nt vel oci t aC, St r i ng pr opr i et ar i o) { setVelocita(velocitaC); t hi s. pr opr i et ar i o = pr opr i et ar i o; } public void setVelcita(int v) { if(v>=0 && v <= 180) { velocitaCorrente = v; } else { velocitaCorrente = 0; } } publ i c voi d set Pr opr i et ar i o( St r i ng p) { pr opr i et ar i o = p; } . . . } publ i c cl ass Test Aut o { publ i c st at i c voi d mai n( St r i ng ar [ ] ) { / / Vogl i o cr ear e l aut o di Paper i no con vel oci t 100 Automobile a = new Automobile(100, Paperino); } } Metodidiistanza,incapsulamento,overloadingecostruttori 25 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Possoancorausarelistanziazioneclassica? Considerandolesempioprecedente,laseguenteistruzionelecita? NO!Perch? perchnonesisteuncostruttorenellaclasseAut omobi l e chenonaccettain ingressoparametri(chiamatocostruttoredidefault)! Perchprimaeralecita?Eperchpotevoistanziareoggetti? senonvienedefinitouncostruttoreallinternodiunaclasse,neviene assegnatounodidefault(costruttoredidefault)chenonaccettainingresso parametrielacuiimplementazionepiomenolaseguente: Aut omobi l e a = new Aut omobi l e( ) ; publ i c cl ass Aut omobi l e { . . . publ i c Aut omobi l e( ) { } } Metodidiistanza,incapsulamento,overloadingecostruttori 26 14 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Overlodareicostruttori Sempre! ovviamentedovehasenso chesignificarenderelaclassepiflessibile Overlodareicostruttorivuoldirerealizzarepicostruttoriche inizializzanolpggettovariandolalistadeiparametriformali neicostruttoriincuinonvienerichiestoilvalorediinizializzazionedi unopiattributi,devono,nellimplementazione,comunque inizializzaretaliattributi Metodidiistanza,incapsulamento,overloadingecostruttori 27 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempio:definizioneclasseAutomobile publ i c cl ass Aut omobi l e { pr i vat e i nt vel oci t aCor r ent e; pr i vat e St r i ng pr opr i et ar i o; publ i c Aut omobi l e( i nt vel oci t aC, St r i ng pr opr i et ar i o) { set Vel oci t aCor r ent e( vel oci t aC) ; t hi s. pr opr i et ar i o = pr opr i et ar i o; } publ i c Aut omobi l e( St r i ng pr opr i et ar i o) { vel oci t aCor r ent e = 0; t hi s. pr opr i et ar i o = pr opr i et ar i o; } publ i c Aut omobi l e( i nt vel oci t a) { set Vel oci t aCor r ent e( vel oci t a) ; t hi s. pr opr i et ar i o = nul l ; } publ i c Aut omobi l e( ) { vel oci t aCor r ent e = 0; t hi s. pr opr i et ar i o = nul l ; } . . . } Metodidiistanza,incapsulamento,overloadingecostruttori 28 15 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esempio:usoclasseAutomobile publ i c cl ass Test Aut omobi l e { publ i c st at i c voi d mai n( St r i ng a[ ] ) { / / Vogl i o cr ear e una aut o con vel oci t cor r ent e 100 / / e pr opr i et ar i o Paper i no Aut omobi l e a1 = new Aut omobi l e( 100, Paper i no) ; / / Vogl i o cr ear e una aut o con pr opr i et ar i o Paper i no Aut omobi l e a2 = new Aut omobi l e( Paper i no) ; / / Vogl i o cr ear e una aut o con vel oci t cor r ent e 130 Aut omobi l e a3 = new Aut omobi l e( 130) ; / / Vogl i o cr ear e una aut o con val or i di def aul t Aut omobi l e a2 = new Aut omobi l e( ) ; . . . } } Metodidiistanza,incapsulamento,overloadingecostruttori 29 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Richiamareuncostruttoredaunaltro Comenotato,icostruttorivistinellesempiocompionole stesseazioni: inizializzareilvaloredivel coi t aCor r ent e edipr opr i et ar i o comodoinvocaredauncostruttoreunaltrocostruttore passandoigiustiargomenti atuttiglieffettilinvocazionediunmetodo Regolapiomenogenerale: implementoilcostruttore(a)cheaccettainingressoivaloripertutti gliattributidiistanzainizializzabiliconpassaggiodiparametri implementoicostruttoricheaccettanoiningressounsottoinsiemedei valoriaccettatidalcostruttore(a)invocandoilcostruttore(a)stesso comesefosseunmetodo Metodidiistanza,incapsulamento,overloadingecostruttori 30 16 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Lakeywordthis Perfareci,noninvocoesplicitamenteilcostruttoreconilnome,ma utilizzolakeywordt hi s (deveesserelaprimaistruzionenelladefinizione delmetodo) publ i c cl ass Aut omobi l e { pr i vat e i nt vel oci t aCor r ent e; pr i vat e St r i ng pr opr i et ar i o; publ i c Aut omobi l e( i nt vel oci t aC, St r i ng pr opr i et ar i o) { set Vel oci t aCor r ent e( vel oci t aC) ; t hi s. pr opr i et ar i o = pr opr i et ar i o; } publ i c Aut omobi l e( St r i ng pr opr i et ar i o) { t hi s( 0, pr opr i et ar i o) ; } publ i c Aut omobi l e( i nt vel oci t a) { t hi s( vel oci t a, nul l ) ; } publ i c Aut omobi l e( ) { t hi s( 0, nul l ) ; } . . . } Metodidiistanza,incapsulamento,overloadingecostruttori 31 Software Architecture Lab www.sal.disco.unimib.it Software Architecture Lab www.sal.disco.unimib.it Esercizi Individuaremetodidiincapsulamentoecostruttori perunaclassecherappresentaunautomobilecaratterizzatada: velocitaCorrente velocitaMassima numeroDiTelaio unaclassecherappresentaunavideocassetta.Lavideocassetta caratterizzatada untitolo, unadurata ilfattochesiaprotettaomenoinregistrazione Metodidiistanza,incapsulamento,overloadingecostruttori 32