Java 'offentlig' adgangsmodifikator

1. Oversigt

I denne hurtige artikel dækker vi offentlig modifikator i dybden, og vi vil diskutere, hvornår og hvordan man bruger det med klasser og medlemmer.

Derudover illustrerer vi ulemperne ved at bruge offentlige datafelter.

For en generel oversigt over adgangsmodifikatorer, se bestemt vores artikel om Access Modifiers i Java.

2. Hvornår skal man bruge Public Access Modifier

Offentlige klasser og grænseflader sammen med offentlige medlemmer definerer en API. Det er den del af vores kode, som andre kan se og bruge til at kontrollere vores objekters opførsel.

Overforbrug af den offentlige modifikator er imidlertid i strid med indkapslingsprincippet Object-Oriented Programming (OOP) og har et par ulemper:

  • Det øger størrelsen på en API, hvilket gør det sværere for klienter at bruge
  • Det bliver sværere at ændre vores kode, fordi kunder er afhængige af den - eventuelle fremtidige ændringer kan bryde deres kode

3. Offentlige grænseflader og klasser

3.1. Offentlige grænseflader

En offentlig grænseflade definerer en specifikation, der kan have en eller flere implementeringer. Disse implementeringer kan enten leveres af os eller skrives af andre.

For eksempel udsætter Java API den Forbindelse interface til at definere databaseforbindelsesoperationer, hvilket efterlader den faktiske implementering til hver leverandør Ved kørsel får vi den ønskede forbindelse baseret på projektopsætningen:

Forbindelsesforbindelse = DriverManager.getConnection (url);

Det getConnection metode returnerer en forekomst af en teknologispecifik implementering.

3.2. Offentlige klasser

Vi definerer offentlige klasser, så klienter kan bruge deres medlemmer ved instantiering og statisk henvisning:

assertEquals (0, ny BigDecimal (0) .intValue ()); // instansmedlem assertEquals (2147483647, Integer.MAX_VALUE); // statisk medlem 

Desuden kan vi designe offentlige klasser til arv ved at bruge det valgfri abstrakt modifikator. Når vi bruger abstrakt modifikator, klassen er som et skelet, der har felter og præimplementerede metoder, som enhver konkret implementering kan brugeud over at have abstrakte metoder, som hver underklasse skal implementere.

For eksempel giver Java-samlingsrammen den AbstraktListe klasse som grundlag for oprettelse af tilpassede lister:

offentlig klasse ListOfThree udvider AbstractList {@ Override offentlig E get (int-indeks) {// tilpasset implementering} @ Override offentlig int-størrelse () {// brugerdefineret implementering}}

Så vi er kun nødt til at implementere få() og størrelse() metoder. Andre metoder som indeks af() og indeholderAlle () er allerede implementeret for os.

3.3. Indlejrede offentlige klasser og grænseflader

I lighed med offentlige topklasser og grænseflader definerer indlejrede offentlige klasser og grænseflader en API-datatype. De er dog især nyttige på to måder:

  • De angiver overfor API-slutbrugeren, at den vedlagte toptypetype og dens lukkede typer har et logisk forhold og bruges sammen
  • De gør vores kodebase mere kompakt ved at reducere antallet af kildekodefiler, som vi ville have brugt, hvis vi havde erklæret dem som topklasser og grænseflader

Et eksempel er Kort.Indgang interface fra kernen Java API:

for (Map.Entry post: mapObject.entrySet ()) {}

At lave Kort.Indgang a indlejret grænseflade relaterer det stærkt til java.util.Kort interface og har reddet os fra at oprette en anden fil inde i java.util pakke.

Læs artiklen om indlejrede klasser for flere detaljer.

4. Offentlige metoder

Offentlige metoder giver brugerne mulighed for at udføre færdige operationer. Et eksempel er offentligheden toLowerCase metode i Snor API:

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

Vi kan med sikkerhed gøre en offentlig metode statisk, hvis den ikke bruger nogen instansfelter. Det parseInt metode fra Heltal klasse er et eksempel på en offentlig statisk metode:

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

Konstruktører er normalt offentlige, så vi kan instantiere og initialisere objekter, selvom de nogle gange kan være private som i singletoner.

5. Offentlige felter

Offentlige felter tillader direkte ændring af et objekts tilstand. Tommelfingerreglen er, at vi ikke skal bruge offentlige felter. Der er flere grunde til dette, som vi er ved at se.

5.1. Trådsikkerhed

Brug af offentlig synlighed med ikke-endelige felter eller endelige mutable felter er ikke trådsikker. Vi kan ikke kontrollere at ændre deres referencer eller tilstande i forskellige tråde.

Se vores artikel om trådsikkerhed for at lære mere om skrivning af trådsikker kode.

5.2. Foranstaltninger til ændringer

Vi har ingen kontrol over et ikke-endeligt offentligt felt, fordi dets reference eller tilstand kan indstilles direkte.

I stedet er det bedre at skjule felterne ved hjælp af en privat modifikator og bruge en offentlig setter:

offentlig klasse studerende {privat int alder; public void setAge (int age) {if (age 150) {throw new IllegalArgumentException (); } this.age = alder; }}

5.3. Ændring af datatype

Offentlige felter, mutable eller immutable, er en del af klientens kontrakt. Det er sværere at ændre datarepræsentationen for disse felter i en fremtidig frigivelse, fordi klienter muligvis skal omlægge deres implementeringer.

Ved at give felter privat rækkevidde og bruge accessorer har vi fleksibiliteten til at ændre den interne repræsentation, samtidig med at vi opretholder den gamle datatype:

 offentlig klasse Student {privat StudentGrade klasse; // ny datarepræsentation offentlig ugyldighed setGrade (int grade) {this.grade = new StudentGrade (grade); } public int getGrade () {returner this.grade.getGrade (). intValue (); }}

Den eneste undtagelse for at bruge offentlige felter er brugen af ​​statiske endelige uforanderlige felter til at repræsentere konstanter:

offentlig statisk endelig String SLASH = "/";

6. Konklusion

I denne vejledning så vi, at den offentlige modifikator bruges til at definere en API.

Vi beskrev også, hvordan overbrug af denne modifikator kan begrænse muligheden for at introducere forbedringer af vores implementering.

Endelig diskuterede vi, hvorfor det er en dårlig praksis at bruge offentlige modifikatorer til felter.

Og som altid er kodeeksemplerne i denne artikel tilgængelige på GitHub.


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