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