2

クライアントがいくつかの動作を利用するために実装できるインターフェースを使用して、完全な API を設計しました。内部的には、独自の実装クラスを使用して、より豊富な API を利用したいと考えています。私はこれらの実装がインタフェースベースの API に準拠し続けることを望んでいますが、Java のジェネリクスの処理が邪魔になっています。

次に例を示します。

public interface PublicAPI {
    void doSomething(SomeType object);
}

public class SomeTypeImpl implements SomeType { }

public class InternalClass implements PublicAPI {
    public void doSomething(SomeTypeImpl object) {
        // ...
    }
}

場合によっては、 などのワイルドカードを使用してパブリック API で型を指定することができますが、<T extends SomeType>これはメソッドの衝突を引き起こす汎用コレクションで機能しません。

このタイプの設計 (またはより優れた設計) をサポートする方法はありますか? それとも、内部クラスとパブリック API の実装の間を行き来する運命にあるのでしょうか?

ありがとう!


アップデート

API が提供するものよりも具体的な型を強制することが実際には不可能である理由がよくわかりました。誰かがオブジェクトのインスタンスを取得すると、特定性の低いタイプで「汚染」される可能性があります。

ACL の提案に従って、私は独自の特定のパッケージ内で内部クラスを使用し、パブリック API インターフェイスを使用してそれらの「ビュー」を作成するというアプローチを採用しました。ビューが作成されると、オブジェクトは不純であるというフラグが付けられ、オブジェクトがインターフェイス以外の型であることを保証できなくなります。私自身のクラス内では、不純なオブジェクトが処理されたときに例外をスローします (これは、参照が時期尚早にリークすることを許可されたことを意味するため)。

さらなる洞察のために質問を開いたままにします。

4

1 に答える 1

1

インターフェイスをジェネリファイしないのはなぜですか? 何かのようなもの:

public interface PublicAPI<T extends SomeType> {
    void doSomething(T object);
}

ちなみに、インターフェースを次のように拡張できます。

public interface InternalPublicAPI extends PublicAPI { .... 内部メソッドをここに追加 }

Hibernate にはそのようなものがSessionありSessionImplementorます。インターフェイスがあります。

于 2012-06-29T22:46:13.667 に答える