Was ist Java-Kapselung?

Was ist Kapselung?

Eine Funktion, die den Zugriff auf Klassenfelder und -methoden einschränkt. Es hat die Aufgabe zu verhindern, dass Felder und Methoden für unerwartete Zwecke verwendet werden.

//Beispiel: Benutzerklasse mit Zeichenfolgenname und ganzzahligem Geld im Feld
public class User {
	String name;
	int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}
}

Der Name und das Geld der Benutzerklasseninstanz können frei geändert werden.

public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.name + "Der Geldbetrag, den Sie haben" + user.money + "Kreis");
//Es kann ein leerer Name sein
		user.name = "";
//Der Betrag kann negativ sein
		user.money = -1000;
		System.out.println(user.name + "Der Geldbetrag, den Sie haben" + user.money + "Kreis");
	}
}

Ausführungsergebnis

Taro Suzukis Geld beträgt 100 Yen
Der Geldbetrag, den Sie haben-1000 Yen

Verkapselungsmethode

Machen Sie die Zugriffsmodifikatoren von Feldern und Methoden privat, damit andere Klassen für die Kapselung nicht geändert werden.

Dadurch wird verhindert, dass es von anderen Klassen geändert wird.

Es ist Standard, das Feld privat und die Methode öffentlich zu machen.

//Beispiel: Benutzerklasse einkapseln
public class User {
	private String name;
	private int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}
}

So greifen Sie auf private Felder zu

Wenn Sie ein Feld privat machen, können Sie den Wert des Felds nicht von anderen Klassen abrufen oder ändern.

public class User {
//Bei dieser Rate der Name der Instanz,Geld kann nicht geändert werden
	private String name;
	private int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}
}

In einem solchen Fall können Sie den Feldwert sicher von außerhalb der Klasse abrufen und ändern, indem Sie eine Methode definieren, um den Feldwert in der Klasse abzurufen und zu ändern.

Die Methode zum Abrufen des Feldwerts wird als Getter bezeichnet, und die Methode zum Ändern des Felds wird als Setter bezeichnet.

Wie man einen Getter definiert

Der Name der Getter-Methode ist im Allgemeinen so etwas wie "Feldname abrufen". Gibt den Wert des Feldes als Rückgabewert zurück.

//Beispiel: Fügen Sie der Benutzerklasse Namen und Geld hinzu
public class User {
	private String name;
	private int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}

//Name Getter
	public String getName() {
		return this.name;
	}

//Geldbeschaffer
	public int getMoney() {
		return this.money;
	}
}
//Holen Sie sich Namen und Geld mit Getter
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
	}
}

Ausführungsergebnis

Taro Suzukis Geld beträgt 100 Yen

So definieren Sie einen Setter

Der Name der Setter-Methode ist im Allgemeinen so etwas wie "Set-Feldname". Weisen Sie den als Argument empfangenen Wert dem Wert des Feldes zu.

//Beispiel: Fügen Sie der Benutzerklasse Namens- und Geldsetzer hinzu
public class User {
	private String name;
	private int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}

//Name Getter
	public String getName() {
		return this.name;
	}

//Namensgeber
	public void setName(String name) {
		this.name = name;
	}

//Geldbeschaffer
	public int getMoney() {
		return this.money;
	}

//Geldsetzer
	public void setMoney(int money) {
		this.money = money;
	}
}
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
		user.setName("Taro Sato");
		user.setMoney(500);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
	}
}

Ausführungsergebnis

Taro Suzukis Geld beträgt 100 Yen
Taro Satos Geld beträgt 500 Yen

Vorteile der Verwendung von Gettern und Setzern

Wenn Sie Getter und Setter verwenden, können Sie auch private Felder abrufen und ändern. Ist dies also nicht dasselbe wie öffentliche? Sie mögen denken, aber die Verwendung von Gettern und Setzern hat die folgenden Vorteile.

1. Felder können schreibgeschützt oder schreibgeschützt sein

Sie können nur Getter für ein Feld definieren, andernfalls ist das Feld schreibgeschützt und Sie können den Wert des Felds verwenden, ohne zu verhindern, dass es von anderen Klassen geändert wird.

Wenn nur der Setter für das Feld definiert ist und der Getter nicht definiert ist, ist das Feld schreibgeschützt. (Es gibt nicht viel Verwendung wie diese)

//Beispiel: Deaktivieren Sie den Geldsetzer in der Benutzerklasse, um schreibgeschütztes Geld zu verdienen
public class User {
	private String name;
	private int money;

	public User(String name, int money) {
		this.name = name;
		this.money = money;
	}

//Name Getter
	public String getName() {
		return this.name;
	}

//Namensgeber
	public void setName(String name) {
		this.name = name;
	}

//Geldbeschaffer
	public int getMoney() {
		return this.money;
	}

//Ohne Geldsetzer
//Verhindert, dass Geld aus anderen Klassen gewechselt wird
//
//	public void setMoney(int money) {
//		this.money = money;
//	}
}

2. Das Umbenennen eines Feldes wirkt sich nicht auf andere Klassen aus

Wenn Sie ein Feld später umbenennen und keine Getter oder Setter verwenden, müssen Sie den Code für alle Klassen ändern, die das Feld verwenden.

Wenn Sie jedoch Getter und Setter verwenden, müssen Sie nur den Code in den Getter- und Setter-Methoden ändern.

//Beispiel: Auch wenn der Name der Benutzerklasse in Benutzername geändert wird, muss die Hauptmethode nicht geändert werden.
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
	}
}
public class User {
	private String userName; //name ->Wechseln Sie zu Benutzername
	private int money;

	public User(String userName, int money) {
		this.userName = userName;
		this.money = money;
	}

//userName getter
	public String getName() {
		return this.userName;
	}

//Benutzername Setter
	public void setName(String userName) {
		this.userName = userName;
	}
//Es sind keine Codeänderungen erforderlich, da die Variable userName in der Hauptmethode nicht angezeigt wird
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
	}
}

Ausführungsergebnis

Taro Suzukis Geld beträgt 100 Yen
Taro Satos Geld beträgt 100 Yen

3. Sie können den Wert überprüfen, bevor Sie den Wert des Felds ändern

Sie können verhindern, dass der Feldwert in einen unerwarteten Wert geändert wird, indem Sie Code hinzufügen, der den Wert des Arguments in der Setter-Methode überprüft.

Beispiel: Überprüfen Sie die korrekte Anzahl von Zeichen, bevor Sie den Benutzernamen der Benutzerklasse ändern

//Benutzername Setter
//Ändern Sie den Benutzernamen, wenn die Argumentzeichenfolge 3 bis 10 Zeichen umfasst
	public void setName(String userName) {
		if (userName.length() < 3) {
			System.out.println("Der Name ist zu kurz");
		} else if (userName.length() > 11) {
			System.out.println("Der Name ist zu lang");
		} else {
			this.userName = userName;
			System.out.println("Name"" + this.userName + "Gewechselt zu");
		}
	}
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
		user.setName("Suzuki");
		user.setName("Ich heiße Taro Suzuki! !!");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Der Geldbetrag, den Sie haben" + user.getMoney() + "Kreis");
	}
}

Ausführungsergebnis

Taro Suzukis Geld beträgt 100 Yen
Der Name ist zu kurz
Der Name ist zu lang
Der Name wurde in "Taro Sato" geändert.
Taro Satos Geld beträgt 100 Yen

Zusammenfassung

Recommended Posts

Was ist Java-Kapselung?
Was ist java
Was ist Java <>?
Was ist java
Was ist Java-Technologie?
Was ist Java API-Java?
[Java] Was ist flatMap?
[Java] Was ist ArrayList?
Was ist Java Assertion? Zusammenfassung.
Java (Kapselung)
Was ist eine Java-Sammlung?
[Java] Kapselung
[Java] Was ist jaee j2ee?
[Java] Was ist Klassenvererbung?
[Java-Grundlagen] Was ist Klasse?
Was ist Java-Fluchtanalyse?
Was ist JVM (Java Virtual Machine)?
[Java] Was in der Kapselung stecken geblieben ist
Was ist Thread-sicher (mit Java)
[Java] Was ist die Ausnahme für gleichzeitige Änderungen?
Was ist ein Lambda-Ausdruck (Java)
Was ist Cubby?
Was ist Maven?
Was ist Jackson?
Was ist Selbst
Was ist Jenkins?
Was ist ArgumentMatcher?
Was ist IM-Jonglieren?
Was ist params
Was ist SLF4J?
Was ist Fassade? ??
Was ist Gradle?
Was ist POJO?
Was ist centOS?
Was ist RubyGem?
Was ist before_action?
Was ist Docker?
Was ist Byte?
Was ist Tomcat?
Was ist eine Klasse in der Java-Sprache (3 /?)
Was ist das beste Lesen von Dateien (Java)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist Java und Entwicklungsumgebung (MAC)
Was ist eine Klasse in der Java-Sprache (2 /?)
Was ist die Hauptmethode in Java?
Was ist Maven Assembly?
Was ist Docker-Compose?
Was ist ein Konstruktor?
Was ist vue cli
Was ist eine Schnittstelle?
Was ist das Java Servlet / JSP MVC-Modell?
Was ist Rubys Selbst?
Was ist harte Codierung?
Was ist ein Stream?
Was ist Rubys attr_accessor?
Was ist die Erlaubnis verweigert?
Was ist Instanzsteuerung?