Java Getter / Setter Ich dachte, es wäre lang und UZEEEEE !!!!, aber ich fand Artikel wie diesen, was mich ein wenig nachdenken ließ. Also werde ich in meiner bevorzugten (nicht guten) D-Sprache darüber nachdenken.
Da es sich um Tama Science and Technology AC handelt, werde ich vorerst die Objektorientierung und Java erläutern. Das Hauptthema ist von [hier](in #d Sprache).
Die Objektorientierung ist eine der Richtlinien für das Software-Design und die Idee, dass "alles ein Objekt ist (eine Entität, die verwandte Daten gruppieren und Zuweisungen, Konvertierungen, Funktionen usw. ausführen kann)". Laut Alan Kay, der das Wort zum ersten Mal verwendete,
Es scheint.
Die Entwurfszeichnung eines Objekts lautet "Klasse", und nichts beginnt, wenn Sie es nicht zuerst schreiben.
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));
}
}
Es ist eine andere Geschichte, dass Java String nach langer Zeit als String geschrieben hat.
Student
ist eine ** Entwurfszeichnung ** von Studentendaten, und die neuen Taro
und Jiro
in Main
sind ** Objekte (Instanzen) **, die die Entitäten sind.
Die nach Klassen geordneten Daten heißen ** Mitglied **. Name
und Nummer
in Student sind ebenfalls Mitglieder (Mitgliedsvariablen). Wahrscheinlich der Name bzw. die Schülernummer.
In der Student-Klasse gibt es eine Methode namens "Student (string, int)". Die Methode mit demselben Namen wie die Klasse wird als Konstruktor bezeichnet und beim Erstellen des Objekts aufgerufen (diesmal bei new Student (~) ...).
Das Schlüsselwort "public" wird den Mitgliedsvariablen vorangestellt. Diese werden als Zugriffsmodifikatoren bezeichnet. Es gibt verschiedene Arten, aber vorerst
--public: von überall zugänglich --private: Kann nur von Ihrer Klasse aus aufgerufen werden.
Alles was Sie tun müssen, ist es gedrückt zu halten. Wenn Sie den Namen und die Nummer von Test1.java auf privat setzen
Test2.java
class Student{
private String name;
private int number;
Student(String name, int number){
this.name = name;
this.number = number;
}
}
Versucht zu kompilieren
$ javac Test2.java
Test2.java:15:Error:Der Name wird privat von Student abgerufen
System.out.println("taro's name:"+taro.name);
^
Test2.java:16:Error:Die Nummer wird von Student privat abgerufen
System.out.println("jiro's number:"+String.valueOf(jiro.number));
Es wird sein.
Wenn alle Mitglieder öffentlich sind, wird es eine Menge Ärger geben. Für Test1.java können Sie dies beispielsweise auch tun.
taro.number = -23;
jiro.name = null;
Eine Schule, die einen negativen Wert für die Schülernummer verwendet, hat eine gute Persönlichkeit. Es ist noch lächerlicher, dass der Name null ist. Auf jeden Fall kann aufgrund eines Fehlers (oder einer Böswilligkeit) des Programmierers ein solcher Fehler auftreten.
Daher ist es denkbar, alle Mitgliedsvariablen privat zu machen und eine andere Mitgliedsmethode für den Zugriff darauf vorzubereiten.
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()));
}
}
Versucht zu rennen
$ 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)
Sie können es überprüfen, wenn Sie es ordnungsgemäß zurücksetzen (obwohl Sie es mit dem Konstruktor tun können). Solche Mitgliedsmethoden werden Getter / Setter genannt.
Versuchen wir nun, der Schülerklasse Noten für Japanisch, Mathematik und Englisch hinzuzufügen.
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 Wenn dies 10 Themen werden ... ist es die Hölle. Kommen wir also zum Anfang zurück.
property Lassen Sie uns vorerst Test3.java mit der Eigenschaft neu schreiben.
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, die Länge der Schnur ändert sich nicht viel, oder? Mit der Eigenschaft können Sie Variablen jedoch einfach so bearbeiten, als würden Sie direkt mit ihnen spielen.
test3.d(Fortsetzung)
void main(){
import std.stdio;
Student saburo=new Student("Mukai Saburo",18);
saburo.name.writeln;
saburo.number=-1;
saburo.number.writeln;
}
Lauf
$ ./test3
Mukai Saburo
[email protected](16): Assertion failure
(Folgendes wird weggelassen)
Ich habe auch einen Assert-Fehler erhalten.
invariant Es ist jedoch nicht so sehr wie es ist. Also fand ich heraus, dass es eine "Invariante" gibt, die den invarianten Zustand eines Mitglieds bestimmen kann, also werde ich sie verwenden. Das Innere der Invariante wird zu folgenden Zeiten aufgerufen.
--Nach dem Ausführen des Konstruktors, bevor der Destruktor ausgeführt wird
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;
}
Lauf
$ ./test3
Mukai Saburo
[email protected](9): Assertion failure
(Folgendes wird weggelassen)
Gute Arbeit. Natürlich können Sie auch den Konstruktor überprüfen, sodass Sie dort nicht "assert" setzen müssen. Übrigens scheint diese Schreibweise auch ab v2.081.0 von dmd möglich zu sein.
invariant(_name!=null);
invariant(_number>0);
Qiita: Brauchen Sie doch Getter / Setter? Brauchst du es nicht dlang.org: Contract Programming
Recommended Posts