web-dev-qa-db-fra.com

Java - Classe abstraite pour contenir des variables?

Est-ce une bonne pratique de laisser les classes abstraites définir des variables d'instance?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

La sous-classe, ExternalJavaScript.class, obtiendrait alors automatiquement la variable source, mais je pense qu'il est plus facile de lire le code si toutes les sous-classes elles-mêmes définissent la source, au lieu de l'héritage.

Quel est ton consseille?

/Adam

24
Adam Asham

J'aurais pensé que quelque chose comme ça serait beaucoup mieux, puisque vous ajoutez une variable, alors pourquoi ne pas restreindre l'accès et la rendre plus propre? Votre getter/setters devrait faire ce qu'ils disent sur l'étain.

public abstract class ExternalScript extends Script {

    private String source;

    public void setSource(String file) {
        source = file;
    }

    public String getSource() {
        return source;
    }
}

Pour en revenir à la question, avez-vous déjà pris la peine de regarder où se trouve le code getter/setter lorsque vous le lisez? S'ils sont tous récupérés et configurés, vous n'avez pas à vous soucier de ce que la fonction "fait" lors de la lecture du code. Il y a quelques autres raisons de penser aussi:

  • Si la source était protégée (donc accessible par les sous-classes) alors le code devient compliqué: qui change les variables? Lorsqu'il s'agit d'un objet, il devient alors difficile de refactoriser, tandis qu'une méthode a tendance à faciliter cette étape.
  • Si vos méthodes getter/setter ne sont pas récupérées et définies, alors décrivez-les comme autre chose.

Pensez toujours si votre classe est vraiment différente ou non, et cela devrait vous aider à décider si vous avez besoin de plus.

32
Egwor

Bien sûr, pourquoi pas?
Les classes de base abstraites ne sont qu'une commodité pour héberger le comportement et les données communes à 2 classes ou plus en un seul endroit pour l'efficacité du stockage et de la maintenance. C'est un détail d'implémentation.
Veillez toutefois à ne pas utiliser une classe de base abstraite alors que vous devriez utiliser une interface. Voir Interface vs classe de base

8
Gishu

Bien sûr. L'idée générale des classes abstraites est qu'elles peuvent contenir des comportements ou des données que toutes les sous-classes doivent contenir. Pensez à l'exemple simple de WheeledVehicle - il devrait avoir une variable membre numWheels. Vous voulez que toutes les sous-classes aient cette variable. N'oubliez pas que les classes abstraites sont une fonctionnalité très utile lors du développement d'API, car elles peuvent garantir que les personnes qui étendent votre API ne la casseront pas.

2
Dermot