CodeGym /Java-Blog /Random-DE /Zugriffsmodifikatoren in Java
Autor
Artem Divertitto
Senior Android Developer at United Tech

Zugriffsmodifikatoren in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! In der heutigen Lektion machen wir uns mit dem Konzept der Zugriffsmodifikatoren vertraut und betrachten Beispiele für die Arbeit mit ihnen. Natürlich ist es nicht ganz richtig zu sagen „lernen Sie es kennen“: Die meisten davon kennen Sie bereits aus früheren Lektionen. Lassen Sie uns für alle Fälle unsere Erinnerung an den wichtigsten Punkt auffrischen. Bei Zugriffsmodifikatoren handelt es sich meist um Schlüsselwörter, die den Zugriff auf verschiedene Teile Ihres Codes regeln. Warum „am häufigsten“? Weil einer von ihnen standardmäßig ohne die Verwendung eines Schlüsselworts festgelegt ist :) Java verfügt über vier Zugriffsmodifikatoren. Wir listen sie in der Reihenfolge vom restriktivsten bis zum „nachsichtigsten“ auf:
  • Privatgelände;
  • Standard (Paket sichtbar);
  • geschützt;
  • öffentlich.
Werfen wir einen Blick auf jeden einzelnen davon und identifizieren wir, wann er nützlich sein könnte. Und wir geben Beispiele :)

Der private Modifikator

Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 2private ist der restriktivste Zugriffsmodifikator. Es beschränkt die Sichtbarkeit von Daten und Methoden auf innerhalb einer einzelnen Klasse. Sie kennen diesen Modifikator aus der Lektion über Getter und Setter. Erinnern Sie sich an dieses Beispiel?

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Wir haben es in einer früheren Lektion betrachtet. Wir haben hier einen schwerwiegenden Fehler gemacht: Wir machen unsere Daten öffentlich, was es anderen Programmierern ermöglicht, direkt auf die Felder zuzugreifen und ihre Werte zu ändern. Darüber hinaus wurden diese Werte ohne Prüfung zugewiesen. Das bedeutet, dass unser Programm eine Katze mit dem Namen „“ mit einem Alter von -1000 Jahren und einem Gewicht von 0 erstellen könnte. Um dieses Problem zu lösen, haben wir Getter und Setter verwendet und außerdem den privaten Modifikator verwendet, um den Zugriff auf die Daten zu beschränken.

public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
Grundsätzlich sind die Beschränkung des Zugriffs auf Felder und die Implementierung von Gettern und Settern die häufigsten Beispiele dafür, wie privat es istwürde in der realen Arbeit verwendet werden. Mit anderen Worten: Der Hauptzweck dieses Modifikators besteht darin, eine Kapselung in einem Programm zu erreichen. Dies gilt übrigens nicht nur für Felder. Stellen Sie sich vor, in Ihrem Programm gibt es eine Methode, die eine SEHR komplexe Funktionalität implementiert. Was können wir als Beispiel vorschlagen? Nehmen wir an, Ihre readDataFromCollider()-Methode akzeptiert als Eingabe eine Datenadresse, liest Daten vom Large Hadron Collider im Byteformat, wandelt diese Daten in Text um, schreibt sie in eine Datei und druckt sie aus. Sogar eine Beschreibung der Methode sieht beängstigend aus, ganz zu schweigen vom Code :) Um den Code besser lesbar zu machen, wäre es am besten, nicht die gesamte komplexe Logik der Methode an einer Stelle zu schreiben. Stattdessen sollten wir die Funktionalität in separate Methoden aufteilen. Zum Beispiel die Funktion readByteData()Die Methode „ convertBytesToSymbols()“ ist für das Lesen der Daten verantwortlich, die Methode „convertBytesToSymbols()“ wandelt die vom Collider gelesenen Daten in Text um, die Methode „ saveToFile()“ speichert den empfangenen Text in einer Datei und die Methode „printColliderData()“ druckt unsere Datendatei. Am Ende wird unsere readDataFromCollider()- Methode viel einfacher sein:

public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
Wie Sie sich jedoch aus der Lektion über Schnittstellen erinnern, erhält der Benutzer nur Zugriff auf die externe Schnittstelle. Und unsere 4 Methoden gehören nicht dazu. Es handelt sich um Hilfsmethoden: Wir haben sie erstellt, um die Lesbarkeit des Codes zu verbessern und nicht vier verschiedene Aufgaben in einer Methode zusammenzupacken. Sie müssen dem Benutzer keinen Zugriff auf diese Methoden gewähren. Wenn Benutzer beim Arbeiten mit dem Collider Zugriff auf die Methode „convertBytesToSymbols()“ haben , werden sie höchstwahrscheinlich einfach von der Methode verwirrt sein und sich fragen, wozu sie dient. Welche Bytes werden konvertiert? Wo kommst du her? Warum sie in Text umwandeln? Die in dieser Methode ausgeführte Logik ist nicht Teil der dem Benutzer zugänglich gemachten Schnittstelle. Nur readDataFromCollider()Die Methode ist Teil der Schnittstelle. Was machen wir also mit diesen vier „internen“ Methoden? Rechts! Verwenden Sie den privaten Modifikator, um den Zugriff darauf einzuschränken. Auf diese Weise können sie ihre Arbeit innerhalb der Klasse in Ruhe ausführen, ohne den Benutzer zu verwirren, der nicht die Logik jeder einzelnen Methode kennen muss.

public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

Der geschützte Modifikator

Der nächst restriktivere Modifikator ist protected . Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 3Felder und Methoden, die mit dem geschützten Zugriffsmodifikator gekennzeichnet sind, werden angezeigt:
  • innerhalb aller Kurse, die im selben Paket wie unseres enthalten sind;
  • innerhalb aller Klassen, die unsere Klasse erben.
Zunächst ist es schwer vorstellbar, wann dies nötig sein könnte. Seien Sie nicht überrascht: Es gibt weit weniger Anwendungsfälle für protected als für private und sie sind sehr spezifisch. Stellen Sie sich vor, wir hätten eine abstrakte Klasse „AbstractSecretAgent“ , die einen Geheimagenten in einem Geheimdienst darstellt, sowie ein top_secret- Paket, das diese Klasse und ihre Nachkommen enthält. Konkrete Klassen wie FBISecretAgent , MI6SecretAgent , MossadSecretAgent usw. erben es. Innerhalb der abstrakten Klasse wollen wir einen Agentenzähler implementieren. Sie erhöht sich, wenn irgendwo im Programm ein neuer Agent erstellt wird. Paket top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Aber unsere Agenten sind geheim! Das bedeutet, dass sie und niemand sonst wissen sollte, wie viele von ihnen existieren. Wir können den geschützten Modifikator problemlos zum Feld agent_counter hinzufügen . Dann können Instanzen anderer Geheimagentenklassen und anderer Klassen, die sich in unserem top_secret- Paket befinden, ihren Wert erhalten.

public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
Und das ist die Art von Spezialaufgabe, die den geschützten Modifikator erfordert :)

Der Paketsichtbarkeitsmodifikator

Als nächstes auf der Liste steht der Standardmodifikator , auch bekannt als Paketsichtbarkeitsmodifikator . Es wird nicht durch ein Schlüsselwort angegeben, da Java es standardmäßig auf alle Felder und Methoden anwendet. Wenn Sie Folgendes in Ihren Code schreiben:

int x = 10
Die x- Variable hat für dieses Paket sichtbaren Zugriff. Man kann sich leicht merken, was es tut. Grundsätzlich gilt: Standard = geschützte Vererbung :) Wie beim geschützten Modifikator ist seine Anwendung begrenzt. Am häufigsten wird der Standardzugriff in einem Paket verwendet, das einige Dienstprogrammklassen enthält, die nicht die Funktionalität aller anderen Klassen im Paket implementieren. Geben wir ein Beispiel. Stellen Sie sich vor, wir hätten ein „Service“-Paket. Es enthält verschiedene Klassen, die mit einer Datenbank arbeiten. Beispielsweise gibt es eine UserService- Klasse, die Benutzerdaten aus der Datenbank liest, einen CarServiceKlasse, die Fahrzeugdaten aus derselben Datenbank liest, und andere Klassen, die jeweils mit bestimmten Objekttypen arbeiten und entsprechende Daten aus der Datenbank lesen.

package services;

public class UserService {
}

package services;

public class CarService {
}
Es kann jedoch leicht passieren, dass die Daten in der Datenbank in einem Format vorliegen und wir sie in einem anderen benötigen. Stellen Sie sich vor, dass die Geburtsdaten der Benutzer in der Datenbank als <TIMESTAMP WITH TIME ZONE> gespeichert sind...

2014-04-04 20:32:59.390583+02
...und stattdessen brauchen wir das einfachste Objekt – ein java.util.Date . Um dieses Problem zu lösen, können wir innerhalb des Servicepakets eine spezielle Mapper- Klasse erstellen. Es ist für die Konvertierung von Daten aus der Datenbank in unsere bekannten Java-Objekte verantwortlich. Eine einfache Hilfsklasse. Normalerweise deklarieren wir alle Klassen als öffentliche Klasse ClassName , dies ist jedoch keine Voraussetzung. Wir können unsere Hilfsklasse einfach als Klasse Mapper deklarieren . In diesem Fall erfüllt es weiterhin seine Aufgabe, ist aber für niemanden außerhalb des Leistungspakets sichtbar !

package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Und hier ist die grundlegende Begründung: Warum sollte jemand außerhalb eines Pakets eine Hilfsklasse sehen müssen, die nur mit den Klassen in diesem Paket funktioniert?

Der öffentliche Modifikator

Und zu guter Letzt der öffentliche Modifikator! Sie sind diesem Modifikator an Ihrem ersten Lerntag bei CodeGym begegnet, als Sie zum ersten Mal public static void main(String[] args) ausgeführt haben . Zugriffsmodifikatoren.  Privat, geschützt, Standard, öffentlich – 4Nachdem Sie die Lektion über Schnittstellen studiert haben, ist Ihnen der Zweck klar :) Schließlich wurde der öffentliche Modifikator erstellt, um den Benutzern etwas zu bieten. Zum Beispiel die Schnittstelle Ihres Programms. Angenommen, Sie haben ein Übersetzerprogramm geschrieben, das russische Texte ins Englische übersetzen kann. Sie haben eine Translate(String textInRussian) -Methode erstellt, die die gesamte erforderliche Logik implementiert. Sie haben diese Methode mit dem Wort public markiert und jetzt ist sie Teil der Schnittstelle:

public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
Sie können diese Methode an die Schaltfläche „Übersetzen“ auf dem Bildschirm binden und fertig! Jeder kann es nutzen. Die mit dem öffentlichen Modifikator gekennzeichneten Codeteile sind für den Endbenutzer bestimmt. Um ein Beispiel aus der Praxis zu geben: „ Privat “ bezieht sich auf alle Prozesse, die in einem Fernsehgerät ablaufen, während „ Öffentlich “ für die Tasten auf der Fernbedienung steht, die zur Steuerung des Fernsehgeräts verwendet werden. Darüber hinaus muss der Nutzer nicht wissen, wie der Fernseher aufgebaut ist und wie er funktioniert. Die Fernbedienung besteht aus einer Reihe öffentlicher Methoden: on() , off() , nextChannel() , previousChannel() , raiseVolume() , verringertVolume() usw. Um das Gelernte zu vertiefen, empfehlen wir Ihnen, sich eine Videolektion aus unserem Java-Kurs anzusehen
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION