Get / setter Java Je pensais que c'était long et UZEEEEE !!!!, mais j'ai trouvé des Articles comme celui-ci, ce qui m'a fait réfléchir un peu. Je vais donc y réfléchir dans ma langue D préférée (pas bonne).
Puisqu'il s'agit de Tama Science and Technology AC, je vais vous expliquer l'orientation objet et Java pour le moment. Le sujet principal est de [ici](en #d).
L'orientation objet est l'une des lignes directrices de la conception de logiciels et est l'idée que «tout est un objet (une entité qui peut regrouper des données associées et effectuer des affectations, des conversions, des fonctions, etc.)». Selon Alan Kay, qui a utilisé le mot pour la première fois,
Il semble.
Le dessin de conception d'un objet est «classe», et rien ne commence si vous ne l'écrivez pas d'abord.
Test1.java
class Student{
public String name;
public int number;
Student(String name, int number){
this.name = name;
this.number = number;
}
}
public class Test1{
public static void main(String[] args){
Student taro = new Student("Teraoka Taro",27);
Student jiro = new Student("Yamashita Jiro",35);
System.out.println("taro's name:" + taro.name);
System.out.println("jiro's number:" + String.valueOf(jiro.number));
}
}
C'est une autre histoire que Java a écrit String sous forme de chaîne après un long moment.
Student
est un ** dessin de conception ** des données des étudiants, et les nouveaux taro
et jiro
dans main
sont des ** objets (instances) ** qui sont les entités.
Les données organisées par classe sont appelées ** membre **. «Nom» et «numéro» dans Student sont également des membres (variables membres). Probablement le nom et le numéro d'étudiant respectivement.
Il existe une méthode appelée Student (string, int)
dans la classe Student. La méthode portant le même nom que la classe s'appelle le constructeur, et elle est appelée lorsque l'objet est créé (cette fois à new Student (~) ...).
Le mot-clé «public» est ajouté aux variables membres. Ceux-ci sont appelés modificateurs d'accès. Il en existe plusieurs types, mais pour le moment
--public: accessible de n'importe où --private: accessible uniquement à partir de votre classe.
Tout ce que vous avez à faire est de le maintenir enfoncé. Si vous définissez le nom et le numéro de Test1.java sur private
Test2.java
class Student{
private String name;
private int number;
Student(String name, int number){
this.name = name;
this.number = number;
}
}
J'ai essayé de compiler
$ javac Test2.java
Test2.java:15:Erreur:le nom est accessible en privé par l'étudiant
System.out.println("taro's name:"+taro.name);
^
Test2.java:16:Erreur:le numéro est accessible en privé par l'étudiant
System.out.println("jiro's number:"+String.valueOf(jiro.number));
Ce sera.
Si tous les membres sont publics, ce sera beaucoup de problèmes. Par exemple, pour Test1.java, vous pouvez également le faire.
taro.number = -23;
jiro.name = null;
Une école qui utilise une valeur négative pour le nombre d'élèves a une bonne personnalité. C'est encore plus ridicule que le nom soit nul. Quoi qu'il en soit, en raison d'une erreur (ou de la malveillance) du programmeur, un tel bogue peut survenir.
Par conséquent, il est concevable de rendre toutes les variables membres privées et de préparer une autre méthode membre pour y accéder.
Test3.java
class Student{
private String name;
private int number;
Student(String name, int number){
this.name = name;
this.number = number;
}
public String getName(){return name;}
public void setName(String name){
assert name != null;
this.name = name;
}
public int getNumber(){return number;}
public void setNumber(int number){
assert number > 0;
this.number = number;
}
}
public class Test3{
public static void main(String[] args){
Student taro = new Student("Teraoka Taro",27);
Student jiro = new Student("Yamashita Jiro",35);
jiro.getNumber(-5)
System.out.println("taro's name:" + taro.getName());
System.out.println("jiro's number:" + String.valueOf(jiro.getNumber()));
}
}
J'ai essayé de courir
$ javac Test3.java
$ java -ea Test3
Exception in thread "main" java.lang.AssertionError
at Student.setNumber(Test3.java:18)
at Test3.main(Test3.java:27)
Vous pouvez le vérifier lorsque vous le réinitialisez correctement (bien que vous puissiez le faire avec le constructeur). Ces méthodes membres sont appelées getters / setters.
Maintenant, essayons d'ajouter des scores pour le japonais, les mathématiques et l'anglais à la classe Student.
Test3add.java
class Student{
private String name;
private int number;
private int japanese;
private int math;
private int english;
Student(String name, int number){
this.name = name;
this.number = number;
}
public String getName(){return name;}
public void setName(String name){
assert name != null;
this.name = name;
}
public int getNumber(){return this.number;}
public void setNumber(int number){
assert number > 0;
this.number = number;
}
public int getJapanese(){return japanese;}
public void setJapanese(int japanese){
assert japanese >= 0 && japanese <= 100;
this.japanese = japanese;
}
public int getMath(){return math;}
public void setMath(int math){
assert math >= 0 && math <= 100;
this.math = math;
}
public int getEnglish(){return english;}
public void setEnglish(int english){
assert english >= 0 && english <= 100;
this.english = english;
}
}
Cusso Si cela devient 10 sujets ... c'est l'enfer. Alors revenons au début.
property Pour le moment, réécrivons Test3.java en utilisant property.
test3.d
class Student{
private string _name;
private int _number;
@property{
void name(string _name){
assert(_name!=null);
this._name=name;
}
string name(){return _name;}
void number(int _number){
assert(_number>0);
this._number=_number;
}
int number(){return _number;}
}
this(string _name, uint _number){
this._name=_name;
this._number=_number;
}
}
Hmmm, la longueur du cordon ne change pas beaucoup, non? Cependant, la propriété vous permet de manipuler facilement des variables comme si vous jouiez directement avec elles.
test3.d(A continué)
void main(){
import std.stdio;
Student saburo=new Student("Mukai Saburo",18);
saburo.name.writeln;
saburo.number=-1;
saburo.number.writeln;
}
Courir
$ ./test3
Mukai Saburo
[email protected](16): Assertion failure
(Ce qui suit est omis)
J'ai également eu une erreur d'assertion.
invariant Cependant, ce n'est pas tant que ça l'est. Donc, j'ai appris l'existence de ʻinvariant` qui peut déterminer la condition invariante des membres, donc je vais l'utiliser. L'intérieur de l'invariant est appelé aux instants suivants.
--Après avoir exécuté le constructeur, avant d'exécuter le destructeur --Avant et après l'exécution de la fonction membre
test4.d
class Student{
private string _name;
private int _number;
invariant{
assert(_name!=null);
assert(_number>0);
}
@property{
void name(string _name){
this._name=name;
}
string name(){return _name;}
void number(int _number){
this._number=_number;
}
int number(){return _number;}
}
this(string _name, uint _number){
this._name=_name;
this._number=_number;
}
}
void main(){
import std.stdio;
Student saburo=new Student("Mukai Saburo",18);
saburo.name.writeln;
saburo.number=-1;
saburo.number.writeln;
}
Courir
$ ./test3
Mukai Saburo
[email protected](9): Assertion failure
(Ce qui suit est omis)
Bon travail. Bien sûr, vous pouvez également vérifier le constructeur, vous n'avez donc pas besoin de mettre ʻassert` ici. Au fait, il semble que cette façon d'écrire soit également possible à partir de la v2.081.0 de dmd.
invariant(_name!=null);
invariant(_number>0);
Qiita: Avez-vous besoin de getter / setter après tout? Vous n'en avez pas besoin? dlang.org: Contract Programming
Recommended Posts