Une classe qui montre au moins deux types de caractéristiques et qui bascule entre eux avec des balises qui ont ces caractéristiques dans le champ est appelée une classe balisée. La classe suivante est un exemple, et il est possible de représenter des cercles et des rectangles.
package tryAny.effectiveJava;
class Figure {
    enum Shape {
        RECTANGLE, CIRCLE
    }
    //Tenir le type de forme
    final Shape shape;
    //À utiliser uniquement lorsque la forme est RECTANGLE
    double length;
    double width;
    //À utiliser uniquement lorsque la forme est CERCLE
    double radius;
    //Constructeur pour cercle
    Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }
    //Constructeur pour rectangle
    Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width = width;
    }
    double area() {
        switch (shape) {
        case RECTANGLE:
            return length * width;
        case CIRCLE:
            return Math.PI * (radius * radius);
        default:
            throw new AssertionError();
        }
    }
}
De telles classes étiquetées présentent de nombreux inconvénients. Voici une liste des inconvénients.
S'il s'agit d'un langage orienté objet, il peut être amélioré en utilisant une hiérarchie de classes.
La procédure de modification d'une classe balisée vers une hiérarchie de classes est
Le résultat de la correction ci-dessus est le suivant.
package tryAny.effectiveJava;
abstract class Figure {
    abstract double area();
}
class Circle extends Figure {
    final double radius;
    Circle(double radius) {
        this.radius = radius;
    }
    @Override
    double area() {
        return Math.PI * (radius * radius);
    }
}
class Rectangle extends Figure {
    final double length;
    final double width;
    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }
    @Override
    double area() {
        return length * width;
    }
}
En faisant cela, les inconvénients de la classe étiquetée mentionnée ci-dessus sont éliminés.
La hiérarchie de classes peut refléter les relations hiérarchiques d'origine entre les types, ce qui peut améliorer la flexibilité (?) Et améliorer la vérification des erreurs lors de la compilation.
Lorsqu'il s'agit d'ajouter un type carré dans l'exemple ci-dessus, il peut être décrit comme suit en utilisant les caractéristiques de la hiérarchie de classes.
class Square extends Rectangle {
    Square(double side) {
        super(side, side);
    }
}
        Recommended Posts