これは、JoshuaBlochによるEffectiveJavaからの抜粋です-
アイテム14(または第3版のアイテム16):パブリッククラスでは、パブリックフィールドではなくアクセサメソッドを使用します
//このような縮退クラスは公開すべきではありません!
class Point {
public double x;
public double y;
}
このようなクラスのデータフィールドには直接アクセスされるため、これらのクラスにはカプセル化の利点はありません(項目13)。
APIを変更せずに表現を変更することはできません
作者は最後の文とはどういう意味ですか?このステートメントは、同じアイテムで何度も使用されます。提案してください。
エクスポートされたAPIまたはAPIという用語は、本の著者が示唆しているように解釈されます。
エクスポートされたAPIは、APIを定義するパッケージの外部からアクセスできるAPI要素で構成されます。
さて、これは、Pointクラスを想定すると、かなり単純です。
class Point {
public double x;
public double y;
}
ここで、本質的にxとyは、2D平面内の点の表現です。使用することにした場合、たとえば次のようになります。
Point p;
p.x = 5;
p.y = 10;
xとyはパブリックであると宣言されているため、誰でもアクセスできます。したがって、ある日、ポイント表現を2D平面上の半径と角度に切り替えることにします。
class Point {
public double r;
public double angle;
}
上記のコードも変更する必要があります。つまり、Pointオブジェクトを使用するクライアントは、コードを再コンパイルする必要があります。したがって、xとyをパブリックとして宣言することにより、これらの宣言がPointAPIの一部になったことを制限しました。
ただし、より良いアプローチは、ポイントの内部表現をプライベートポイント状態にカプセル化し、必要な機能のみを公開することです。
class Point {
private double x;
private double y;
// Computes norm2 of the point
public double norm2() {
return Math.sqrt(x*x + y*y);
}
}
これで、Pointクラスを使用する人norm
は、次のような方法で、そのケースメソッドでパブリックAPIのみを使用できるようになります。
Point p;
// Init coordinates
double norm = p.norm();
最後に、内部表現を変更したい場合、前の例とは異なり、クライアントコードは変更の影響を受けません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加