Java >> Java tutorial >  >> Tag >> private

Java 'privat' adgangsmodifikator

1. Oversigt

I programmeringssproget Java kan felter, konstruktører, metoder og klasser markeres med adgangsmodifikatorer. I dette selvstudie vil vi tale om det private adgangsmodifikator i Java.

2. Søgeordet

Den private adgangsmodifikator er vigtig, fordi den tillader indkapsling og informationsskjul, som er kerneprincipperne for objektorienteret programmering. Encapsulation er ansvarlig for bundling af metoder og data, mens informationsskjul er en konsekvens af indkapsling - det skjuler et objekts interne repræsentation.

Den første ting at huske er, at elementer erklæret som private kan kun tilgås af den klasse, hvor de er erklæret .

3. Felter

Nu vil vi se nogle simple kodeeksempler for bedre at forstå emnet.

Lad os først oprette en medarbejder klasse, der indeholder et par private instansvariabler:

public class Employee {
    private String privateId;
    private boolean manager;
    //...
}

I dette eksempel har vi markeret privateId variabel som privat fordi vi ønsker at tilføje noget logik til id-genereringen. Og som vi kan se, gjorde vi det samme med manager attribut, fordi vi ikke ønsker at tillade direkte ændring af dette felt.

4. Konstruktører

Lad os nu oprette en privat konstruktør:

private Employee(String id, String name, boolean managerAttribute) {
    this.name = name;
    this.privateId = id + "_ID-MANAGER";
}

Ved at markere vores konstruktør som privat , vi kan kun bruge det inde fra vores klasse.

Lad os tilføje en statisk metode, der vil være vores eneste måde at bruge denne private konstruktør uden for medarbejderen klasse:

public static Employee buildManager(String id, String name) {
    return new Employee(id, name, true);
}

Nu kan vi få en lederinstans af vores medarbejder klasse ved blot at skrive:

Employee manager = Employee.buildManager("123MAN","Bob");

Og bag kulisserne, selvfølgelig, buildManager metode kalder vores private konstruktør.

5. Metoder

Lad os nu tilføje en privat metode til vores klasse:

private void setManager(boolean manager) {
    this.manager = manager;
}

Og lad os antage, at vi af en eller anden grund har en vilkårlig regel i vores virksomhed, hvor kun en medarbejder ved navn "Carl" kan forfremmes til leder, selvom andre klasser ikke er klar over dette. Vi opretter en offentlig metode med en vis logik til at håndtere denne regel, der kalder vores private metode:

public void elevateToManager() {
    if ("Carl".equals(this.name)) {
        setManager(true);
    }
}

6. privat i aktion

Lad os se et eksempel på, hvordan du bruger vores medarbejder klasse udefra:

public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123");
        employee.setPrivateId("BCD234");
        System.out.println(employee.getPrivateId());
    }
}

Efter at have udført ExampleClass , vil vi se dens output på konsollen:

BCD234_ID

I dette eksempel brugte vi den offentlige konstruktør og offentligheden metode changeId(customId) fordi vi ikke kan få adgang til den private variabel privateId direkte.

Lad os se hvad der sker, hvis vi forsøger at få adgang til en privat metode, konstruktør eller variabel uden for vores medarbejder klasse:

public class ExampleClass {

    public static void main(String[] args) {
        Employee employee = new Employee("Bob","ABC123",true);
        employee.setManager(true);
        employee.privateId = "ABC234";
    }
}

Vi får kompileringsfejl for hver af vores ulovlige udtalelser:

The constructor Employee(String, String, boolean) is not visible
The method setManager(boolean) from the type Employee is not visible
The field Employee.privateId is not visible

7. Klasser

Der er et særligt tilfælde, hvor vi kan oprette en privat klasse — som en indre klasse af en anden klasse. Ellers, hvis vi skulle erklære en ydre klasse som privat , ville vi forbyde andre klasser at få adgang til det, hvilket gør det ubrugeligt:

public class PublicOuterClass {

    public PrivateInnerClass getInnerClassInstance() {
        PrivateInnerClass myPrivateClassInstance = this.new PrivateInnerClass();
        myPrivateClassInstance.id = "ID1";
        myPrivateClassInstance.name = "Bob";
        return myPrivateClassInstance;
    }

    private class PrivateInnerClass {
        public String name;
        public String id;
    }
}

I dette eksempel oprettede vi en privat indre klasse i vores PublicOuterClass  ved at angive den private adgangsmodifikator.

Fordi vi brugte den private søgeord, hvis vi af en eller anden grund forsøger at instansiere vores PrivateInnerClass uden for PublicOuterClass , vil koden ikke kompilere, og vi vil se fejlen:

PrivateInnerClass cannot be resolved to a type

8. Konklusion

I denne hurtige selvstudie har vi diskuteret det private adgangsmodifikator i Java. Det er en god måde at opnå indkapsling på, hvilket fører til, at information skjules. Som et resultat kan vi sikre, at vi kun eksponerer de data og den adfærd, vi ønsker, for andre klasser.

Som altid er kodeeksemplet tilgængeligt på GitHub.


Java tag