Java >> Java tutorial >  >> Tag >> public

Java 'offentlig' adgangsmodifikator

1. Oversigt

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

Derudover vil vi illustrere ulemperne ved at bruge offentlige datafelter.

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

2. Hvornår skal du bruge Public Access Modifier

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

Overbrug af den offentlige modifikator overtræder imidlertid indkapslingsprincippet for objektorienteret programmering (OOP) og har et par ulemper:

  • Det øger størrelsen af ​​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 – fremtidige ændringer kan ødelægge 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 skrevet af andre.

For eksempel afslører Java API'en Forbindelsen interface til at definere databaseforbindelsesoperationer, der overlader den faktiske implementering til hver leverandør. Ved kørsel får vi den ønskede forbindelse baseret på projektopsætningen:

Connection connection = DriverManager.getConnection(url);

getConnection metode returnerer en forekomst af en teknologispecifik implementering.

3.2. Offentlige klasser

Vi definerer offentlige klasser, så kunder kan bruge deres medlemmer ved instansiering og statisk reference:

assertEquals(0, new BigDecimal(0).intValue()); // instance member
assertEquals(2147483647, Integer.MAX_VALUE); // static member

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

For eksempel giver Java-samlingsrammerne AbstractList klasse som grundlag for oprettelse af tilpassede lister:

public class ListOfThree<E> extends AbstractList<E> {

    @Override
    public E get(int index) {
        //custom implementation
    }

    @Override
    public int size() {
        //custom implementation
    }

}

Så vi skal kun implementere get() og størrelse() metoder. Andre metoder som indexOf() og containsAll() er allerede implementeret for os.

3.3. Indlejrede offentlige klasser og grænseflader

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

  • De angiver over for API-slutbrugeren, at den omsluttende type på øverste niveau og dens omsluttede 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 klasser og grænseflader på øverste niveau

Et eksempel er kortet . Indgang interface fra kerne Java API:

for (Map.Entry<String, String> entry : mapObject.entrySet()) { }

Opretter kort . Indtastning a indlejret grænseflade relaterer det stærkt til java.util.Map grænsefladen og har reddet os fra at oprette en anden fil i java.util pakke.

Læs artiklen om indlejrede klasser for flere detaljer.

4. Offentlige metoder

Offentlige metoder gør det muligt for brugere at udføre færdige operationer. Et eksempel er den offentlige toLowerCase metode i strengen API:

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

Vi kan roligt gøre en offentlig metode statisk, hvis den ikke bruger nogen instansfelter. 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 instansiere og initialisere objekter, selvom de nogle gange kan være private som i singletons.

5. Offentlige felter

Offentlige felter gør det muligt at ændre et objekts tilstand direkte. Tommelfingerreglen er, at vi ikke skal bruge offentlige felter. Der er flere grunde til dette, som vi er ved at se.

5.1. Tråd-sikkerhed

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

Se venligst vores artikel om trådsikkerhed for at lære mere om at skrive 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 indstilling:

public class Student {

    private int age;
    
    public void setAge(int age) {
        if (age < 0 || age > 150) {
            throw new IllegalArgumentException();
        }
    
        this.age = age;
    }
}

5.3. Ændring af datatype

Offentlige felter, foranderlige eller uforanderlige, er en del af kundens kontrakt. Det er sværere at ændre datarepræsentationen af ​​disse felter i en fremtidig udgivelse, fordi klienter muligvis skal ændre deres implementeringer.

Ved at give felter privat omfang og bruge accessorer, har vi fleksibiliteten til at ændre den interne repræsentation og samtidig bevare den gamle datatype:


public class Student {

    private StudentGrade grade; //new data representation
   
    public void setGrade(int grade) {        
        this.grade = new StudentGrade(grade);
    }

    public int getGrade() {
        return this.grade.getGrade().intValue();
    }
}

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

public static final String SLASH = "/";

6. Konklusion

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

Vi beskrev også, hvordan overforbrug af denne modifikator kan begrænse muligheden for at indføre forbedringer til vores implementering.

Til sidst 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.


Java tag