Qu'est-ce que l'encapsulation Java?

Qu'est-ce que l'encapsulation?

Une fonction qui restreint l'accès aux champs de classe et aux méthodes. Il a pour rôle d'empêcher les champs et les méthodes d'être utilisés à des fins inattendues.

//Exemple: classe d'utilisateurs avec nom de chaîne et argent entier dans le champ
public class User {
	String name;
	int money;

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

Le nom et l'argent de l'instance de classe User peuvent être modifiés librement.

public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.name + "Le montant d'argent dont vous disposez" + user.money + "Cercle");
//Cela peut être un nom vide
		user.name = "";
//Le montant peut être négatif
		user.money = -1000;
		System.out.println(user.name + "Le montant d'argent dont vous disposez" + user.money + "Cercle");
	}
}

Résultat d'exécution

L'argent de Taro Suzuki est de 100 yens
Le montant d'argent dont vous disposez-1000 yens

Méthode d'encapsulation

Rendez les modificateurs d'accès des champs et des méthodes privés que vous ne voulez pas que les autres classes changent pour l'encapsulation.

Cela l'empêchera d'être modifié par d'autres classes.

Il est standard de rendre le champ privé et la méthode publique.

//Exemple: classe d'utilisateurs encapsuler
public class User {
	private String name;
	private int money;

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

Comment accéder aux champs privés

Si vous rendez un champ privé, vous ne pourrez pas obtenir ou modifier la valeur du champ d'autres classes.

public class User {
//À ce rythme, le nom de l'instance,l'argent ne peut pas être changé
	private String name;
	private int money;

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

Dans un tel cas, vous pouvez obtenir et modifier en toute sécurité la valeur du champ depuis l'extérieur de la classe en définissant une méthode pour obtenir et modifier la valeur du champ dans la classe.

La méthode pour obtenir la valeur du champ est appelée le getter, et la méthode pour le modifier est appelée le setter.

Comment définir un getter

Le nom de la méthode getter est généralement quelque chose comme "get field name". Renvoie la valeur du champ comme valeur de retour.

//Exemple: ajouter des getters de nom et d'argent à la classe User
public class User {
	private String name;
	private int money;

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

//getter de nom
	public String getName() {
		return this.name;
	}

//argent getter
	public int getMoney() {
		return this.money;
	}
}
//Obtenez le nom et l'argent en utilisant getter
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
	}
}

Résultat d'exécution

L'argent de Taro Suzuki est de 100 yens

Comment définir un setter

Le nom de la méthode setter est généralement quelque chose comme "set field name". Attribuez la valeur reçue comme argument à la valeur du champ.

//Exemple: ajouter des noms et des régleurs d'argent à la classe d'utilisateurs
public class User {
	private String name;
	private int money;

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

//getter de nom
	public String getName() {
		return this.name;
	}

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

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

//argent setter
	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() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
		user.setName("Taro Sato");
		user.setMoney(500);
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
	}
}

Résultat d'exécution

L'argent de Taro Suzuki est de 100 yens
L'argent de Taro Sato est de 500 yens

Avantages de l'utilisation des getters et des setters

Si vous utilisez des getters et des setters, vous pouvez également obtenir et modifier des champs privés, alors n'est-ce pas la même chose que public? Vous pensez peut-être, mais l'utilisation de getters et de setters présente les avantages suivants.

1. Les champs peuvent être en lecture seule ou en écriture seule

Vous ne pouvez définir que des getters pour un champ, sinon le champ sera en lecture seule et vous pourrez utiliser la valeur du champ tout en l'empêchant d'être modifié par d'autres classes.

De plus, si seul le setter est défini pour le champ et que le getter n'est pas défini, le champ sera en écriture seule. (Il n'y a pas beaucoup d'utilisation comme ça)

//Exemple: désactivez money setter dans la classe User pour gagner de l'argent en lecture seule
public class User {
	private String name;
	private int money;

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

//getter de nom
	public String getName() {
		return this.name;
	}

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

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

//Sans argentier
//Empêche l'argent d'être changé d'autres classes
//
//	public void setMoney(int money) {
//		this.money = money;
//	}
}

2. Renommer un champ n'affecte pas les autres classes

Lorsque vous renommez un champ ultérieurement, si vous n'utilisez pas de getters ou de setters, vous devrez modifier le code de toutes les classes qui utilisent le champ.

Cependant, si vous utilisez des getters et des setters, il vous suffit de modifier le code dans les méthodes getters et setter.

//Exemple: même si le nom de la classe User est changé en userName, la méthode principale n'a pas besoin d'être modifiée.
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
	}
}
public class User {
	private String userName; //name ->Changer en userName
	private int money;

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

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

//Définisseur de nom d'utilisateur
	public void setName(String userName) {
		this.userName = userName;
	}
//Aucune modification de code requise car la variable userName n'apparaît pas dans la méthode principale
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
	}
}

Résultat d'exécution

L'argent de Taro Suzuki est de 100 yens
L'argent de Taro Sato est de 100 yens

3. Vous pouvez inspecter la valeur avant de modifier la valeur du champ

Vous pouvez empêcher que la valeur du champ soit remplacée par une valeur inattendue en ajoutant un code qui vérifie la valeur de l'argument dans la méthode setter.

Exemple: vérifiez le nombre correct de caractères avant de modifier le nom d'utilisateur de la classe User

//Définisseur de nom d'utilisateur
//Modifiez userName si la chaîne d'argument comprend 3 à 10 caractères
	public void setName(String userName) {
		if (userName.length() < 3) {
			System.out.println("Le nom est trop court");
		} else if (userName.length() > 11) {
			System.out.println("Le nom est trop long");
		} else {
			this.userName = userName;
			System.out.println("Nom"" + this.userName + "Changé en");
		}
	}
public class Main {
	public static void main(String[] args) {
		User user = new User("Taro Suzuki", 100);
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
		user.setName("Suzuki");
		user.setName("Je m'appelle Taro Suzuki! !!");
		user.setName("Taro Sato");
		System.out.println(user.getName() + "Le montant d'argent dont vous disposez" + user.getMoney() + "Cercle");
	}
}

Résultat d'exécution

L'argent de Taro Suzuki est de 100 yens
Le nom est trop court
Le nom est trop long
Changement du nom en "Taro Sato"
L'argent de Taro Sato est de 100 yens

Résumé

Recommended Posts

Qu'est-ce que l'encapsulation Java?
Qu'est-ce que 'java
Qu'est-ce que Java <>?
Qu'est-ce que 'java
Qu'est-ce que la technologie Java?
Qu'est-ce que Java API-java
[Java] Qu'est-ce que flatMap?
[Java] Qu'est-ce que ArrayList?
Qu'est-ce que l'assertion Java? Résumé.
java (encapsulation)
Qu'est-ce qu'une collection Java?
[Java] Encapsulation
[Java] Qu'est-ce que jaee j2ee?
[Java] Qu'est-ce que l'héritage de classe?
[Notions de base Java] Qu'est-ce que la classe?
Qu'est-ce que l'analyse Java Escape?
Qu'est-ce que JVM (Java Virtual Machine)?
[Java] Ce qui est resté bloqué dans l'encapsulation
Qu'est-ce que Thread Safe (avec Java)
[Java] Qu'est-ce que l'exception de modification simultanée?
Qu'est-ce qu'une expression lambda (Java)
Qu'est-ce que Cubby
Qu'est-ce que maven?
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que la façade? ??
Qu'est-ce que Gradle?
Qu'est-ce que POJO
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce qu'une classe en langage Java (3 /?)
Quelle est la meilleure lecture de fichier (Java)
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce que Java et l'environnement de développement (MAC)
Qu'est-ce qu'une classe en langage Java (2 /?)
Quelle est la méthode principale en Java?
Qu'est-ce que l'assemblage Maven?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
Qu'est-ce que vue cli
Qu'est-ce qu'une interface
Qu'est-ce que le modèle Java Servlet / JSP MVC?
Qu'est-ce que le moi de Ruby?
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce que l'attr_accessor de Ruby?
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?