2017-02-16 8 views
2

これは論理的な発展のanother questionです。いくつかの実装でサポートされていない可能性があるインターフェイスメソッドを正しく宣言するには?

おそらく、具体的な実装でサポートされているかどうかのいくつかの方法があるかもしれません。目標は、クライアントが特定の実装がそれぞれの特定のメソッドをサポートしているかどうかを調べ、そうでない場合はリカバリするための合理的な方法を提供することです。

私はこの方法がサポートされていない場合は具体的な実装によってスローされる標準java.lang.UnsupportedOperationExceptionを利用思い付いた解決策:

public interface CommonInterface { 
    void possiblyUnsupportedOperation() throws java.lang.UnsupportedOperationException; 
} 

しかし、これは例外メカニズムいるので、悪いソリューションであることが主張されています操作が利用可能かどうかをチェックする手段として使用すべきではありません。したがって、テスターメソッドを使用することをお勧めします。

public interface CommonInterface { 
    void possiblyUnsupportedOperation(); 
    boolean isOperationSupported(); 
} 

しかし、インターフェイスに多数のオプションの操作がある場合はどうなりますか?複数のテスター機能を使用すべきですか?オプションのメソッドをマップするための別のEnumを作成して、それをメソッド記述子として単一のテスター関数に渡す必要がありますか?両方の変種は私にはちょっと頑丈に見えます。

エレガントなコードと優れたデザインソリューションの両方の代替方法がありますか?

+0

[責任の連鎖パターン](https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern)。 –

+0

私はあなたを正しく理解するために[Interface segregation principle](https://en.wikipedia.org/wiki/Interface_segregation_principle) –

+0

@FedericoPeraltaSchaffnerを読んでください。その原則を示唆することによって、すべてのメソッドが確実にサポートされた基本インターフェースを作成し、オプションのメソッドごとに別のインターフェースを作成し、 'if(baseObject instanceof OptionalInterface1){OptionalInterface1 oi1Object =(OptionalInterface1)baseObject; } '? – Semisonic

答えて

0

あなたがそのインターフェイスを所有している場合は、常に実装され、そのインターフェイスから継承するメソッドでParentインターフェイスを抽出できます。

public interface ParentCommonInterface { 
    void method1(); 
    void method2(); 
} 

public interface CommonInterface extends ParentCommonInterface { 
    void possiblyUnsupportedOperation(); 
} 

class MyClass implements ParentCommonInterface {...} 

あなたがAdapterクラスを作成し、オブジェクトを宣言するために1つを使用することができ、そのインタフェースを所有していない場合。

public interface CommonInterface { 

    void possiblyUnsupportedOperation(); 
     boolean isOperationSupported(); 
    } 

    public class AdapterClassOne implements CommonInterface { 
     void possiblyUnsupportedOperation() {...} 
     boolean isOperationSupported() {return false;} 
    } 
} 
関連する問題