- からクラスやメソッドを非表示にするには、「デフォルト」のJavaアクセスを使用することをお勧めします:
我々はファクトリメソッドを使用している場合は、我々が作成を返却する必要があります実装されたインタフェースのタイプとしての実装これは、クラスの場合は、クライアント
public class Factory {
public Product getProduct() {
return new ProductA();
}
}
public interface Product {
}
class ProductA implements Product {
}
に我々が持っている製品{A、B、C ...など}の具体的な実装に戻った製品をキャストするクライアントの機能を回避するには、次の
を- パッケージのクライアントと工場のコードは別々です(
com.example.client
ととしましょう)。 210) - デフォルト( "パッケージ")アクセス方法の場合、()クライアントには見えない、工場から見える
package com.example.client;
...
public class Client {
public static void main(String[] args) {
Product i = new Factory().getProduct();
ProductA a = (ProductA) i; // the type of ProductA isn't visible.
}
}
- コンクリートimplemantations宣言:
たとえば、非表示の方法で同じ工場を使用する必要があります。
public class Factory {
public Product getProduct() {
return new ProductA();
}
Product[] getCreatedProducts() {
...
}
}
私はここで二つの問題を参照してください。
- 悪いパッケージ構造:隠されたクラスやメソッドは、呼び出し元のコードで1つのパッケージにする必要があります。
- 悪いコード:あまり直感的でわかりにくい。 Javaファイルを別のパッケージに置き換えることで簡単に中断することができます。
「保護された」と同じだと思っていましたが、わかりません。私は常にアクセスキーワードを定義します。 –
@Martijn 'protected'はパッケージとサブクラスからアクセス可能です。デフォルト(キーワードなし)はパッケージではアクセスできますが、サブクラスではアクセスできません。 – toto2
@Aghasted私はあなたが正しいことをしていると思います。しかし、私はあなたの "二つの問題"を理解していません。なぜ私はあなたがなぜこれをやっているのかよく分かりません。クライアントからさまざまな 'Product'タイプを隠すのはなぜですか? – toto2