5

次のインターフェースを検討してください。

public interface ThirdPartyApiHandler {

    public OperationResult doOperation(OperationInput input);

    public static class OperationResult {
         //members of OpeationResult. metrics after file processing
         private int successfulRecords;
         private int failedRecords;
    }  

    public static class OperationInput {
         //implementations call third party API to process this file.
         private String inputBatchFile; 
    }  

    //Constant which would be same across all implementations.
    public static final int GLOBAL_CONSTANT = 1;
}

上記のインターフェースは悪いデザインですか?

  1. OperationResultOperationInput静的クラスとして定義されています。それらは実装によってのみ使用され、他の場所では使用されません。ここに見られる利点は、これら 2 つのクラス用に個別のファイルを作成する必要がないことです。また、親クラスの名前空間も取得します。

  2. 定数インターフェイスについて読みました。ただし、この場合、すべての実装で同じになるようにバインドされ、それらの実装で使用される通常のインターフェイスで定数を定義しています。

私はこのパターンを初めて使用しているので、提案を得たいと思っていました。

4

4 に答える 4

4

OperationResult と OperationInput は static 内部クラスとして定義されています。 それらは他のどこにも使用されません。

他の場所では使用されないので問題ありません。それらが私よりも長い場合は、別のクラスに入れたいと思います.

定数インターフェイスについて読みました。ただし、この場合、すべての実装で同じになるようにバインドされ、それらの実装で使用される通常のインターフェイスで定数を定義しています。

これは、そのようなフィールドを宣言するのに適した場所です。

于 2013-08-14T09:37:47.310 に答える
4

インターフェイスにネストされたクラスを持つことは、追加の名前空間の問題だけです。このアプローチは、単純なデータ構造をサポートするために小さなインターフェイスを作成するときにコードを編成するのに役立ちます。

この講義をお勧めします: Java Tip 75: Use nested classes for better organization

publicこの場合、とstaticは冗長なので必要ないことに注意してください。覚えておく必要があるのは、そのようなクラスがあるからといって、他の開発者がそれらをコードの他の部分で使用することを制限するものではないということです。

私の観点からは、これは良い設計ですが、クラスを拡張してインターフェイスに置き換えます。

public interface ThirdPartyApiHandler {

    OperationResult doOperation(OperationInput input);

    interface OperationResult {
         int getSuccessfulRecords();
         int getFailedRecords();
    }  

    interface OperationInput {
         String getInputBatchFile(); 
    }  

    final int GLOBAL_CONSTANT = 1; //This could be replaced by enum but no need 
}
于 2013-08-14T10:03:50.857 に答える
0
Is above interface a bad design?

それは、実装設計とプロジェクトでの使いやすさに依存します。ロジックは私にはすべて合法に見えます。このような設計の可能な使用例は次のとおりです。

public interface A {
    static class B {
        public static boolean verifyState( A a ) {
            return (true if object implementing class A looks to be in a valid state)
        }
    }
}

また

public static class OperationResult {
     //members of OpeationResult. metrics after file processing
     private int successfulRecords;
     private int failedRecords;
} 

上記のクラスには、インスタンス変数 successRecords および failedRecords があります。これらの静的クラスのインスタンス変数も静的にして、 ThirdPartyApiHandler.OperationResult.successfulRecordsを使用してアクセスできるようにしてみませんか。変数に対して静的なゲッターとセッターを使用することもできます。


OperationResult and OperationInput are defined as static inner class.

一般に信じられていることとは反対に、「静的内部クラス」のようなものはありません。これは単純に意味がありません。ネストされたクラスが静的な場合、「内部」クラスも「外部」クラスも存在しないため、「静的内部」クラスにすることはできません。

このSOの質問から上で取り上げました。最初の答えを読んでください。それはあなたのすべての質問に答えると思います。

于 2013-08-14T09:45:36.657 に答える