タグ付けたクラスと呼ばれるものがあります。
二つ以上の機能をカバーするクラスです。
以下の例を見てください。
class Figure {
enum Shape { RECTANGLE, CIRCLE };
final Shape shape;
double length;
double width;
double radius;
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
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();
}
}
}
一クラスの中で二つの機能を実装しています。
コンストラクタも二つとした機能に使うフィールドも全て別々にあります。
当然だが、このような作成は一つの機能を一つのクラスやオブジェクトで作るというオブジェクト指向から見てもアウトで
重複コードも多く、一つの機能を使用する時、他の機能も自動的に生成されるのでメモリの浪費に繋がります、また、読み辛いです・・、。
このような使い方は遠慮してください。
下のよう変えてみました。
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
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;
}
double area() { return length * width; }
}
通常の継承構造です。読み易いし、重複も削除されました。
まとめますと、タグ付けたクラスはなるべく使わないようにしましょう。
良くないコードになる可能性が高いです。
댓글 없음:
댓글 쓰기