Question

J'ai récemment commencé à travailler en Java et j'ai découvert le monde sauvage et fou des accesseurs et des passeurs. Je l'ai détesté au début, mais je me suis vite habitué. Trop habitué.

J'ai passé beaucoup de temps ces derniers temps à réfléchir davantage à la conception des classes. L’une des choses que j’essaie de faire est d’éviter le piège de faire des accesseurs et des passeurs pour tout. Cependant, une grande partie de mon travail concerne des entités qui sont principalement des conteneurs de données et je ne suis pas sûr que les accesseurs / installateurs soient en réalité inappropriés dans ces cas.

Voici un exemple simple utilisant des propriétés publiques.

class Space {
    public String name;
    public String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
}

Voici un exemple simple d'utilisation de propriétés privées et de getters et setters.

class Space {
    private String name;
    private String description;
    Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
    public String getDescription() {
        return this.description;
    }
    public void setDescription(final String description) {
        this.description = description;
    }
}

Dans ces exemples, les champs name et description doivent pouvoir être modifiés.

J'ai l'impression que l'exemple de lecture / définition est plus clair et cache les détails de mise en œuvre de ce que nom et description sont. Cela permettrait également de valider ultérieurement si nécessaire.

J'ai lu plusieurs discussions sur le fait que les Getters et les setters sont diaboliques et / ou anti-modèles, mais j'ai vraiment l'impression que ceux-ci pourraient ne pas s'appliquer à cette situation.

Il y a peut-être des options que je n'ai pas encore envisagées. Je suis ouvert aux suggestions!

Était-ce utile?

La solution

Pour le dire simplement:

  • Vous avez besoin de getters pour tous les champs qui doivent être lus de l'extérieur.
  • Vous avez besoin de paramètres pour tous les champs devant être écrits de l'extérieur.

Cela peut être 100%, mais la plupart du temps c'est moins.

Autres conseils

La première version (propriétés publiques) n’est pas une bonne idée. La seconde est meilleure. Comme le dirait Josh Bloch, " favorise l'immuabilité " :

public class Space {
    private final String name;
    private final String description;

    public Space(final String name, final String description) {
        this.name = name;
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

Cela étant dit, les les getters et les setters ont tendance à être surutilisé .

Vous avez entendu le "trop ??souvent simplifié" "get / setters is evil". Personne (j'espère) vraiment ne veut vraiment pas dire qu'il y a un problème avec les objets de données. Je pense que la vraie idée est:

"Les Getters / Setters sont diaboliques, sauf pour les objets de stockage de données en clair" qui lui-même est juste une évangélisation de "dites ne demandez pas".

Idéalement, si une classe a des accesseurs et des passeurs, c'est tout qu'elle devrait avoir.

C'est de toute façon l'argument. Je ne suis pas sûr d'être d'accord avec cela.

Alors que le modèle d’accessoires permet de masquer les détails d’implémentation d’une classe (par exemple, l’utilisation d’une table de hachage pour stocker les attributs et économiser de la mémoire sur les classes peu utilisées), son implémentation peut être très détaillée (votre exemple comporte 12 lignes de plus avec des accesseurs). C'est pourquoi C # a une syntaxe de propriété spéciale, qui permet de spécifier de manière concise des accesseurs par défaut:

class Space {
    public String Name { get; set; }
    public String Description { get; set; }
    Space(final String name, final String description) {
        this.Name = name;
        this.Description = description;
    }
}

Les formulaires alternatifs peuvent ajouter des spécificateurs d'accès et / ou du code:

private String _name;
public String Name {
    get { if (_name == null) FetchName(); return _name; }
    private set { _name = value; }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top