[JAVA] (Pour les super débutants) Getter / setter et propriété pour penser en langage D

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

À propos du getter / setter Java

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,

  1. Tout est un objet.
  2. Les objets communiquent en recevant et en répondant à des messages.
  3. L'objet a sa propre mémoire.
  4. Chaque objet est une instance d'une classe et une classe est également un objet.
  5. La classe a un comportement partagé pour toutes ses instances. Une instance est une forme d'objet dans un programme.
  6. Lors de l'exécution du programme, le contrôle est passé au premier objet et le reste est traité comme son message.

Il semble.

Droit d'accès

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.

Encapsulation

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.

getter / setter long

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.

En langue D

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

référence

Qiita: Avez-vous besoin de getter / setter après tout? Vous n'en avez pas besoin? dlang.org: Contract Programming

Recommended Posts

(Pour les super débutants) Getter / setter et propriété pour penser en langage D
[Pour les super débutants] Les connaissances minimales que vous voulez garder à l'esprit avec les hachages et les symboles
[Pour les débutants] Comment déboguer avec Eclipse
[Java] [Pour les débutants] Comment insérer des éléments directement dans un tableau à deux dimensions
[Pour les super débutants] Comment utiliser l'autofocus: vrai
[Pour les débutants] DI ~ Les bases de DI et DI au printemps ~
[Pour les débutants] Exemple minimum pour afficher RecyclerView en Java
Introduction à Java pour les débutants Connaissance de base du langage Java ①
Comment utiliser GitHub pour les super débutants (développement d'équipe)
Comment utiliser la méthode getter / setter (en orientation objet)
Stocker dans une carte Java 2D et tourner avec pour instruction
[Pour les débutants] Explication des classes, des instances et des statiques en Java
[Java] Changez la langue et les paramètres régionaux en anglais avec les options JVM
[Pour les super débutants] Super introduction à DBUnit
[Pour les super débutants] Ant super introduction
[Pour les super débutants] Super introduction à Maven
[Pour les débutants] Voici quelques références liées à la technologie et à la carrière.
[Astuces] Comment résoudre les problèmes avec XCode et Swift pour les débutants
[Pour les débutants] Exemple minimum pour mettre à jour RecyclerView avec DiffUtils en Java
Comment installer le langage utilisé dans Ubuntu et comment créer l'environnement