1

保護されている多くのメソッド (30 以上) を持つクラス (カプセル) があります。アイデアは、開発者がこのクラスを拡張し、クラス内で保護されたメソッドを使用できるようにすることです (ImADev) が、それらをパブリックとして公開することは開発者に任せます (必要に応じてメソッドをオーバーライドします)。

これらのオブジェクトをいくつかのユーティリティ クラス/メソッドに渡し、保護されたメソッドにアクセスできるようにするユース ケースがあります。保護されていることを除いて、ユーティリティ クラス/サービスはそれらを見ることができません。

以下の例を参照してください。

// My Capsule class with protected methods
public abstract class Capsule {
   public Capsule(..) { .. }
   protected String getFoo() { return "foo"; }
}

// How a dev should use the class
public class ImADev extends Capsule {
    public ImADev(..) { super(..); }
    public String getBar() { this.getFoo() + "BAR");
}

// A special utility class
// Helper.helper() can accept any class derived from Capsule
public class Helper {
    public String helper(Capsule c) { 
        return " im doing something awesome with " + c.getFoo();
        // Except i cant do this, because c.getFoo() is protected.
    } 
}

これを回避する最善の方法は何ですか? 保護されたメソッドがたくさんあることに注意してください。

4

4 に答える 4

2

クラスがやりすぎているかのどちらかです。その場合、より小さく、より明確に定義されたクラスに分割します

または、ユーティリティ クラスが呼び出して保護されたメソッドをラップできる安全なパブリック メソッドを実装します。

または、公開する可能性がある/公開する必要があるように聞こえるので、単にそれらを公開します

または、クラス内のデータを動作 (構成) から分離すると、ユーティリティ クラスは、内部を変更できる保護された動作メソッドではなく、より安全なパブリック ゲッター メソッドのみを処理する必要があります。

アプリケーションとその使用について詳しく知らずに、より良い答えを提供するのは少し難しい

于 2012-05-24T23:07:52.093 に答える
1

これを「回避」する方法はありませんが、ユーティリティ クラスを保護されたメソッドを持つクラスと同じパッケージに配置する以外に方法はありません。それらのクラスが複数のパッケージに含まれている場合、それは役に立ちません。

protected を使用することを決定する際に、あなたは決定を下しましたが、今ではその影響に行き詰まっています。それをそのまま使用することも、パブリックに変更することも、パッケージ メンバーシップを変更してデフォルト アクセスを利用することもできます。

于 2012-05-24T23:03:59.103 に答える
1

少なくとも 2 つの選択肢があります。

  1. Helper を Capsule のサブクラスにします。または、
  2. 保護されたメソッドをデフォルトのアクセシビリティに変更し、Helper クラスを Capsule クラスと同じパッケージに配置します。

編集:おそらく、リフレクションを使用して、必要なことを正確に達成することもできます。

于 2012-05-24T23:08:04.083 に答える
1

実際には、パッケージまたはサブクラスの外から保護されたメソッドを呼び出す方法があります: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/reflect/AccessibleObject.html

ほんの冗談です!このツールは、永続化のシリアル化などの技術的なもののために存在します。

メソッドを「保護」として宣言することは、コードを整理し、どの部分がどのデータを処理する必要があるかを定義する方法にすぎません。この場合、最初の間違いを修正します。

コードを効率的かつ明確に整理する方法に興味がある場合は、http://java.sun.com/docs/books/effective/を読むことを強くお勧めします。

于 2012-05-24T23:09:34.800 に答える