- Getters dhe setters ju lejojnë të kontrolloni aksesin në atributet private në Java, duke lehtësuar enkapsulimin dhe validimin e të dhënave.
- Përdorimi i tepërt ose i automatizuar mund të çojë në klasa anemike dhe dizajne të brishta; rekomandohet të krijoni vetëm ato të nevojshme bazuar në logjikën e biznesit.
- Kornizat dhe libraritë mund të kërkojnë metoda qasjeje, por ka alternativa të tilla si pandryshueshmëria dhe përdorimi i mjeteve si Lombok.
Brenda universit të programimit të orientuar nga objektet, Java mbetet një nga gjuhët më të njohura dhe më të mësuara, veçanërisht për qartësinë e saj në përcaktimin e koncepteve të tilla si enkapsulimi dhe menaxhimi i aksesit të të dhënave. Dy elementë kyç në këtë kornizë janë metodat e njohura si marrës dhe setues, pjesë themelore për të kontrolluar se si manipulohen dhe ekspozohen të dhënat e brendshme të objektit.
Në këtë artikull do të thellohemi, në një mënyrë të natyrshme dhe me shembuj praktikë, në dobinë, avantazhet dhe madje edhe polemikat që rrethojnë... marrësit dhe setuesit në JavaDo të shpjegojmë se si zbatohen, pse janë të rëndësishme dhe në cilat situata është më mirë t'i përdorni ose, anasjelltas, t'i shmangni. Gjithashtu, do të mbledhim njohuri aktuale mbi praktikat e mira dhe të këqija, në mënyrë që të merrni vendime të informuara kur hartoni klasat tuaja Java.
Çfarë janë marrësit dhe setuesit në Java?
Në Java, parimi i enkapsulimit na çon në mbrojtjen e atributeve të klasave tona duke i shënuar ato si privatos o privatNë këtë mënyrë, ne parandalojmë që ato të aksesohen ose modifikohen lirisht nga jashtë vetë objektit, duke siguruar siguri dhe qëndrueshmëri më të madhe në gjendjen e sistemit. Megjithatë, këto atribute shpesh duhet të konsultohen ose modifikohen nga jashtë. Këtu është vendi ku marrës dhe vendosës, metoda publike të projektuara posaçërisht për të marrë (marrë) ose modifikuar (vendosur) vlerën e këtyre fushave private.
Modeli është aq i zakonshëm sa mjediset e zhvillimit të integruar (IDE) si IntelliJ IDEA ose Eclipse ju lejojnë t'i gjeneroni ato automatikisht. Për shembull, për një klasë të thjeshtë:
Shembull bazë i klasës me marrës dhe përcaktues
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Në këtë model, metodat getName() y setName(Emri i vargut) lejon qasjen dhe modifikimin e atributit emër në mënyrë të kontrolluar. Avantazhi kryesor është se mund të shtoni logjikë ose validime brenda këtyre metodave, duke siguruar që të dhënat janë gjithmonë të qëndrueshme dhe plotësojnë kushte të caktuara.
Pse të përdoren marrësit dhe setuesit? Enkapsulimi dhe kontrolli i aksesit
Arsyeja klasike që justifikon përdorimin e marrës dhe vendosës Është nevoja për të mbrojtur të dhënat e brendshme të një klase. Kur atributet janë publike, ato mund të modifikohen nga kudo në program, gjë që mund të çojë në gjendje të paqëndrueshme ose të papritura.
Le të shohim një klasë, për shembull. Mace me atribute publike:
public class Cat { public String name; public int age; public int weight; }
Në këtë rast, çdo kod i jashtëm mund të bëjë:
Mace cat = new Cat(); cat.name = ""; cat.age = -1000; cat.weight = 0;
Kjo ekspozon plotësisht strukturën e brendshme të klasës dhe lejon vlera të pavlefshme.Duke i bërë atributet private dhe duke ekspozuar vetëm metodat publike të kontrolluara, mund të shtojmë kufizime:
public void setAge(int age) { if (age >= 0) { this.age = age; } else { System.out.println("Gabim! Mosha nuk mund të jetë negative!"); } }
Në këtë mënyrë, ne parandalojmë që mosha e maces të marrë vlera absurde si -1000 dhe Ne e centralizojmë logjikën e validimit në një vend. Në këtë mënyrë, nëse pjesë të shumta të programit duhet të ndryshojnë moshën, të gjitha do të kontrollohen nga i njëjti ekip.
Avantazhet e getter-ave dhe setter-ave në Java
Ka disa përparësi që ofron ky model:
- Mbrojtja e të dhënaveDuke i bërë atributet private, ju parandaloni aksesin dhe modifikimin pa dallim.
- Validimi i centralizuarPërcaktuesit mund të përfshijnë kontrolle përpara se të caktojnë një vlerë, duke siguruar që të përmbushen rregullat e biznesit ose të integritetit.
- Fleksibiliteti i së ardhmes- Nëse në ndonjë moment ju duhet të ndryshoni përfaqësimin e brendshëm të një pjese të të dhënave (p.sh., të llogaritni moshën nga data e lindjes), mund ta bëni këtë brenda marrësit pa ndryshuar pjesën tjetër të kodit që e konsumon atë.
- Pajtueshmëria e kornizësShumë korniza dhe biblioteka Java (si Hibernate, Spring, serializuesit/deserializuesit JSON) kërkojnë praninë e marrësit dhe përcaktuesve për të funksionuar siç duhet.
Përdorimi i getters dhe setters mund ta bëjë kodin më të lehtë për t'u zhvilluar dhe mirëmbajtur në planin afatgjatë., duke ju lejuar të modifikoni logjikën e brendshme pa prishur ndërfaqen publike të një klase.
Shembull praktik dhe strukturë tipike
Duke u kthyer te shembulli i propozuar nga disa faqe interneti të njohura, një klasë Llogari Shpesh shfaqet në tutoriale për të ilustruar këtë koncept:
class Account { private double balance; private double limit; public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; } public double getLimite() { return limit; } public void setLimite(double limit) { this.limit = limit; } }
Kjo strukturë, megjithëse funksionale, kohët e fundit është kritikuar për nxitjen e përhapjes së metodave që, në shumë raste, nuk kanë qëllim. Një nga problemet më të zakonshme është gjenerimi pa dallim i marrësve dhe vendosësve pa vlerësuar nëse ata janë vërtet të nevojshëm për dizajnin ose logjikën e biznesit.
Rreziqet dhe praktikat e këqija: Kur nuk duhet t’i përdorni tepër marrësit dhe vendosësit?
Gjenerimi automatik i të gjithë marrësve dhe vendosësve mund të çojë në ato që njihen si klasa anemike ose "klasa kukullash", të cilat thjesht veprojnë si kontejnerë të dhënash pa asnjë logjikë të vetën. Kjo mund të ketë disa pasoja negative:
- Ekspozim i panevojshëmNëse të gjitha vetitë mund të aksesohen ose modifikohen nga jashtë, një pjesë e mbrojtjes që kërkon enkapsulimi humbet.
- Kompleksiteti i shpërndarëKur atributet aksesohen dhe modifikohen nga shumë pika në sistem, është e vështirë të centralizohen rregullat ose validimet e biznesit.
- Model i dobët i domenitLogjika e biznesit duhet të jetë brenda entiteteve të domenit, në vend që të jetë e shpërndarë nëpër shërbime ose pjesë të tjera të sistemit.
Për shembull, vendosja e bilancit të një llogarie bankare duke përdorur setBalance() mund të mos ketë kuptim: Është e preferueshme të ofrohen metoda specifike, të tilla si deposit() ose withdraw(), që përfshijnë rregullat përkatëse. (p.sh., kontrollimi i limitit të llogarisë kur bëni një tërheqje). Kjo e bën kodin më të qartë dhe më të fuqishëm:
public void deposit(double x) { this.balance += x; } public void get(double x) { if (this.balance + this.limit >= x) { this.balance -= x; } else { throw new IllegalArgumentException("tejkaluar limitin!"); } }
Kjo parandalon manipulimin e ekuilibrit nga jashtë, duke ruajtur integritetin e sistemit.
Praktika të mira gjatë implementimit të marrësve dhe vendosësve
Bazuar në përvojën e ndarë në artikuj dhe blogje të shumta teknike, ekzistojnë disa rekomandime për përdorimin e arsyeshëm të marrësve dhe setuesve:
- Mos i gjeneroni ato automatikisht për të gjitha atributetShtojini vetëm nëse janë vërtet të nevojshme për modelin ose arkitekturën tuaj.
- Përfshini validimet vetëm aty ku është e nevojshmeJo të gjitha atributet kërkojnë kontrolle komplekse, por ato që ndikojnë në logjikë duhet.
- Konsideroni pandryshueshmërinë për objekte të caktuara. Ju mund të krijoni klasa të pandryshueshme (për shembull, me atribute përfundimtare dhe pa përcaktues), gjë që zvogëlon gabimet dhe vështirësitë e debugging-ut.
- Peshon nevojat e kornizaveNdonjëherë do t'ju duhet të përfshini këto metoda që mjete si Hibernate ose Jackson të funksionojnë, por përpiquni t'i izoloni këto kërkesa nga logjika juaj kryesore nëse është e mundur.
Në fund të fundit, Përdorni mbledhësit dhe vendosësit si mekanizma kontrolli dhe jo si zgjidhje automatikeÇdo atribut dhe metodë duhet t'i shtojë vlerë të vërtetë klasës suaj.
Alternativa dhe modele moderne
Evolucioni i Java-s dhe modeleve të dizajnit ofron alternativa interesante ndaj përdorimit tradicional të getter-ave dhe setter-ave:
- Klasa publike për struktura të thjeshta të të dhënaveNëse janë thjesht "bartës të dhënash" pa logjikë, mund të përdorni klasa me atribute publike, duke shmangur kodin përsëritës.
- Duke përdorur biblioteka si LombokMund t’i etiketoni klasat tuaja me shënime si @Getter dhe @Setter për të gjeneruar automatikisht metoda dhe për të zvogëluar format e zakonshme.
- Promovimi i pandryshueshmërisëShpesh është e preferueshme të krijohen objekte që nuk mund ta ndryshojnë gjendjen e tyre pasi të jenë krijuar, gjë që eliminon nevojën për caktues dhe parandalon gabimet e vështira për t'u ndjekur.
Për shembull, për një entitet të pandryshueshëm mund të implementoni diçka të tillë:
public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = Objects.requireNonNull(name); this.age = Objects.requireNonNull(age); } public String getName() { return name; } public int getAge() { return age; } }
Këtu ekziston vetëm një metodë marrëse (getter) dhe objekti nuk mund ta ndryshojë kurrë gjendjen e tij pas krijimit. Kjo është një teknikë shumë e rekomanduar për entitetet që nuk duhen modifikuar.
Marrësit dhe setuesit në kontekstin e kornizave dhe librarive
Getters dhe setters nuk përdoren gjithmonë për arsye dizajni., por sepse disa korniza e kërkojnë atë. Për shembull, libraritë ORM si Hibernate ose mjetet e serializimit/deserializimit të objekteve (p.sh., Çfarë është BLOB) kërkojnë që entitetet të kenë metoda publike për të aksesuar atributet. Kështu, shumë zhvillues detyrohen të përfshijnë këto metoda, qoftë edhe vetëm për të përmbushur këto nevoja teknike.
Nga ana tjetër, kornizat si Spring kanë ndikuar gjithashtu në përhapjen e përcaktuesve, veçanërisht në fazën e konfigurimit të varësisë (injektimi i përcaktuesit). Megjithatë, këshillohet të preferohet injeksioni i konstruktorit sa herë që është e mundur, pasi siguron që objektet të krijohen gjithmonë në një gjendje të qëndrueshme dhe minimizon gabimet e shkaktuara nga objektet e paplota.
A duhet të krijoni gjithmonë marrës dhe vendosës? Mendime përfundimtare?
Përgjigja nuk është gjithmonë pozitive: Jo të gjitha atributet kanë nevojë për metodat e tyre të aksesit, dhe as të gjitha klasat nuk kërkojnë marrës dhe përcaktues.Për më tepër, përdorimi pa dallim i këtyre metodave mund ta bëjë kodin tuaj më të brishtë, më pak të sigurt dhe më pak të përafruar me parimet e programimit të orientuar nga objektet.
Mund të analizoni nëse keni nevojë vërtet të ekspozoni të dhënat ose nëse ka mekanizma më të mirë për të enkapsuluar logjikën dhe për të ruajtur kontrollin e gjendjes. Hartoni klasat tuaja në mënyrë që informacioni të rrjedhë në një mënyrë të kontrolluar, duke shmangur tendencën për të gjeneruar automatikisht metoda pa vlerësuar ndikimin e tyre.
Ky debat shkon përtej një çështjeje të thjeshtë kodi. Njohja e kohës dhe mënyrës së përdorimit të tyre, zbatimi i validimeve, promovimi i pandryshueshmërisë dhe kuptimi i kontekstit të kornizës janë faktorë vendimtarë në krijimin e kodit Java të qëndrueshëm, të shkallëzueshëm dhe të lehtë për t’u mirëmbajtur.Përfitoni nga përfitimet e enkapsulimit, por gjithmonë merrni në konsideratë rreziqet e përdorimit të tepërt dhe alternativat e disponueshme në Java.
Përmbajtja
- Çfarë janë marrësit dhe setuesit në Java?
- Pse të përdoren marrësit dhe setuesit? Enkapsulimi dhe kontrolli i aksesit
- Avantazhet e getter-ave dhe setter-ave në Java
- Shembull praktik dhe strukturë tipike
- Rreziqet dhe praktikat e këqija: Kur nuk duhet t’i përdorni tepër marrësit dhe vendosësit?
- Praktika të mira gjatë implementimit të marrësve dhe vendosësve
- Alternativa dhe modele moderne
- Marrësit dhe setuesit në kontekstin e kornizave dhe librarive
- A duhet të krijoni gjithmonë marrës dhe vendosës? Mendime përfundimtare?