Eine Klasse, die zwei oder mehr Arten von Merkmalen anzeigt und zwischen ihnen mit Tags wechselt, die diese Merkmale im Feld aufweisen, wird als markierte Klasse bezeichnet. Die folgende Klasse ist ein Beispiel und es ist möglich, Kreise und Rechtecke darzustellen.
package tryAny.effectiveJava;
class Figure {
enum Shape {
RECTANGLE, CIRCLE
}
//Formtyp halten
final Shape shape;
//Nur verwenden, wenn die Form RECHTECKIG ist
double length;
double width;
//Nur verwenden, wenn die Form KREIS ist
double radius;
//Konstruktor für Kreis
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
//Konstruktor für Rechteck
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();
}
}
}
Solche markierten Klassen haben viele Nachteile. Unten finden Sie eine Liste der Nachteile.
Wenn es sich um eine objektorientierte Sprache handelt, kann sie mithilfe einer Klassenhierarchie verbessert werden.
Das Verfahren zum Ändern von einer markierten Klasse zu einer Klassenhierarchie lautet
Das obige Korrekturergebnis ist wie folgt.
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;
}
}
Auf diese Weise werden die Nachteile der oben erwähnten markierten Klasse beseitigt.
Die Klassenhierarchie kann die tatsächlichen hierarchischen Beziehungen zwischen Typen widerspiegeln, wodurch die Flexibilität (?) Und die Fehlerprüfung zur Kompilierungszeit verbessert werden können.
Wenn im obigen Beispiel ein Quadrat hinzugefügt wird, kann dies anhand der Merkmale der Klassenhierarchie wie folgt beschrieben werden.
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
}
Recommended Posts