„Verejný“ modifikátor prístupu Java

1. Prehľad

V tomto rýchlom článku sa budeme venovať verejné do hĺbky a spolu s triedami a členmi prediskutujeme, kedy a ako ich použiť.

Ďalej ilustrujeme nevýhody používania verejných dátových polí.

Všeobecný prehľad o modifikátoroch prístupu nájdete v našom článku Modifikátory prístupu v Jave.

2. Kedy použiť modifikátor verejného prístupu

Verejné triedy a rozhrania spolu s verejnými členmi definujú API. Je to tá časť nášho kódu, ktorú môžu ostatní vidieť a použiť na riadenie správania našich objektov.

Nadmerné použitie verejného modifikátora však porušuje princíp zapuzdrenia objektovo orientovaného programovania (OOP) a má niekoľko negatív:

  • Zvyšuje veľkosť API, čo sťažuje jeho používanie klientmi
  • Zmena nášho kódu je čoraz ťažšia, pretože sa na ňu zákazníci spoliehajú - akékoľvek budúce zmeny by mohli narušiť ich kód

3. Verejné rozhrania a triedy

3.1. Verejné rozhrania

Verejné rozhranie definuje špecifikáciu, ktorá môže mať jednu alebo viac implementácií. Tieto implementácie môžu byť poskytnuté buď nami, alebo ich môžu napísať iní.

Napríklad Java API vystavuje Pripojenie rozhranie na definovanie operácií databázového pripojenia, pričom skutočnú implementáciu necháva na každého dodávateľa. Za behu získame požadované pripojenie na základe nastavenia projektu:

Pripojenie pripojenia = DriverManager.getConnection (url);

The getConnection metóda vracia inštanciu implementácie špecifickej pre technológiu.

3.2. Verejné triedy

Definujeme verejné triedy, aby klienti mohli používať svojich členov inštanciami a statickými odkazmi:

assertEquals (0, nový BigDecimal (0) .intValue ()); // člen inštancie assertEquals (2147483647, Integer.MAX_VALUE); // statický člen 

Okrem toho môžeme voliteľné navrhnúť verejné triedy pre dedenie abstraktné modifikátor. Keď používame abstraktné modifikátor, trieda je ako kostra, ktorá má polia a vopred implementované metódy, ktoré môže použiť ktorákoľvek konkrétna implementácia, okrem toho, že má abstraktné metódy, ktoré musí každá podtrieda implementovať.

Napríklad rámec zbierok Java poskytuje AbstractList triedy ako základ pre vytváranie prispôsobených zoznamov:

public class ListOfThree extends AbstractList {@Override public E get (int index) {// custom implementation} @Override public int size () {// custom implementation}}

Musíme teda iba implementovať dostať () a veľkosť () metódy. Ostatné metódy ako indexOf () a containsAll () sú pre nás už implementované.

3.3. Vnorené verejné triedy a rozhrania

Podobne ako verejné triedy a rozhrania najvyššej úrovne, vnorené verejné triedy a rozhrania definujú dátový typ API. Sú však obzvlášť užitočné dvoma spôsobmi:

  • Označujú koncového používateľa API, že priložený typ najvyššej úrovne a jeho priložené typy majú logický vzťah a používajú sa spolu.
  • Vďaka nim je naša základňa kódov kompaktnejšia znížením počtu súborov zdrojových kódov, ktoré by sme použili, keby sme ich deklarovali ako triedy a rozhrania najvyššej úrovne.

Príkladom je Mapa.Vstup rozhranie z jadra Java API:

pre (položka Map.Entry: mapObject.entrySet ()) {}

Tvorba Mapa.Vstup a vnorené rozhranie ho silno súvisí s java.util.Map rozhranie a zachránil nás pri vytváraní iného súboru vo vnútri java.util balíček.

Prečítajte si článok o vnorených triedach, kde nájdete ďalšie podrobnosti.

4. Verejné metódy

Verejné metódy umožňujú používateľom vykonávať hotové operácie. Príkladom je verejnosť toLowerCase metóda v String API:

assertEquals ("alex", "ALEX" .toLowerCase ());

Verejnú metódu môžeme bezpečne urobiť statickou, ak nepoužíva žiadne inštančné polia. The parseInt metóda z Celé číslo triedy je príkladom verejnej statickej metódy:

assertEquals (1, Integer.parseInt ("1"));

Konštruktory sú zvyčajne verejné, aby sme mohli vytvárať inštancie a inicializovať objekty, aj keď niekedy môžu byť súkromné ​​ako v singletoch.

5. Verejné polia

Verejné polia umožňujú priamu zmenu stavu objektu. Platí pravidlo, že by sme nemali používať verejné polia. Existuje niekoľko dôvodov, ako sa chystáme zistiť.

5.1. Bezpečnosť závitov

Použitie verejnej viditeľnosti s nekoncovými poľami alebo konečnými premenlivými poľami nie je bezpečné pre vlákna. Nemôžeme kontrolovať zmenu ich referencií alebo stavov v rôznych vláknach.

V našom článku o bezpečnosti vlákien sa dozviete viac o písaní kódu bezpečného pre vlákna.

5.2. Prijatie opatrení v súvislosti s úpravami

Nemáme kontrolu nad nekončiacim sa verejným poľom, pretože jeho referenciu alebo stav je možné nastaviť priamo.

Namiesto toho je lepšie skryť polia pomocou súkromného modifikátora a použiť verejný setter:

public class Student {private int age; public void setAge (int age) {if (age 150) {throw new IllegalArgumentException (); } this.age = vek; }}

5.3. Zmena typu údajov

Verejné polia, zmeniteľné alebo nemenné, sú súčasťou zmluvy s klientom. V budúcom vydaní je ťažšie zmeniť dátovú reprezentáciu týchto polí, pretože klienti možno budú musieť refaktorovať svoje implementácie.

Poskytnutím súkromného rozsahu poliam a používaním prístupových zariadení máme flexibilitu zmeniť internú reprezentáciu a zároveň zachovať starý dátový typ:

 verejná trieda Student {private StudentGrade grade; // nová reprezentácia údajov public void setGrade (int grade) {this.grade = new StudentGrade (grade); } public int getGrade () {return this.grade.getGrade (). intValue (); }}

Jedinou výnimkou pre použitie verejných polí je použitie statických konečných nemenných polí na vyjadrenie konštánt:

verejné statické konečné reťazce SLASH = "/";

6. Záver

V tomto tutoriáli sme videli, že verejný modifikátor sa používa na definovanie API.

Tiež sme opísali, ako nadmerné používanie tohto modifikátora môže obmedziť schopnosť zaviesť vylepšenia našej implementácie.

Nakoniec sme diskutovali o tom, prečo nie je dobré používať verejné modifikátory pre polia.

A ako vždy, ukážky kódov tohto článku sú k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found