[JAVA] (Für Super-Anfänger) Getter / Setter und Eigenschaft, in D-Sprache zu denken

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.

Über Java Getter / Setter

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,

  1. Alles ist ein Objekt.
  2. Objekte kommunizieren durch Empfangen und Beantworten von Nachrichten.
  3. Das Objekt hat einen eigenen Speicher.
  4. Jedes Objekt ist eine Instanz einer Klasse, und eine Klasse ist auch ein Objekt.
  5. Die Klasse hat für alle Instanzen ein gemeinsames Verhalten. Eine Instanz ist eine Objektform in einem Programm.
  6. Bei der Programmausführung wird die Steuerung an das erste Objekt übergeben und der Rest wird als dessen Nachricht behandelt.

Es scheint.

Zugriffsrecht

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.

Verkapselung

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.

Getter / Setter lang

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.

In D Sprache

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);

Referenz

Qiita: Brauchen Sie doch Getter / Setter? Brauchst du es nicht dlang.org: Contract Programming

Recommended Posts

(Für Super-Anfänger) Getter / Setter und Eigenschaft, in D-Sprache zu denken
[Für Super-Anfänger] Das Mindestwissen, das Sie mit Hashes und Symbolen berücksichtigen möchten
[Für Anfänger] So debuggen Sie mit Eclipse
[Java] [Für Anfänger] So fügen Sie Elemente direkt in ein zweidimensionales Array ein
[Für Super-Anfänger] Verwendung des Autofokus: true
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
[Für Anfänger] Mindestbeispiel für die Anzeige von RecyclerView in Java
Einführung in Java für Anfänger Grundkenntnisse der Java-Sprache ①
Wie man GitHub für Super-Anfänger benutzt (Teamentwicklung)
Verwendung der Getter / Setter-Methode (in Objektorientierung)
In Java 2D-Karte speichern und mit for-Anweisung drehen
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
[Java] Ändern Sie Sprache und Gebietsschema mit JVM-Optionen in Englisch
[Für Super-Anfänger] DBUnit Super-Einführung
[Für Super-Anfänger] Ameise Super-Einführung
[Für Super-Anfänger] Maven Super-Einführung
[Für Anfänger] Hier einige Referenzen zu Technologie und Karriere.
[Tipps] So lösen Sie Probleme mit XCode und Swift für Anfänger
[Für Anfänger] Mindestbeispiel zum Aktualisieren von RecyclerView mit DiffUtils in Java
Wie installiere ich die in Ubuntu verwendete Sprache und wie erstelle ich die Umgebung?