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. OperationResult并被OperationInput定义为静态类。它们只会被实现使用,而不是其他任何地方。我在这里看到的优势是 - 我不必为这两个类创建单独的文件。他们还获得父类的命名空间。

  2. 我已阅读有关常量接口的信息。但在这种情况下,我在普通接口中定义常量,这些常量在所有实现中都是相同的,并且将在这些实现中使用。

我第一次使用这种模式,所以想得到建议。

4

4 回答 4

4

OperationResult 和 OperationInput 被定义为静态内部类。 它们不会在其他任何地方使用。

没关系,因为它们不会在其他任何地方使用。如果它们比我更愿意将它们放在单独的班级中。

我已阅读有关常量接口的信息。但是在这种情况下,我在普通接口中定义了常量,这些常量在所有实现中都是相同的,并且将在这些实现中使用。

那是声明这样一个字段的好地方。

于 2013-08-14T09:37:47.310 回答
4

在接口中拥有嵌套类只是额外命名空间的问题。当创建小接口以支持简单的数据结构时,这种方法有助于组织代码。

我向您推荐这个讲座:Java 技巧 75:使用嵌套类来更好地组织

请注意publicstatic在这种情况下是多余的,因此您不需要它们。您需要记住的是,拥有这样的类不会限制其他开发人员在代码的其他部分中使用它们。

从我的角度来看,这是一个很好的设计,但是我会用接口扩展和替换类。

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;
} 

在上面的类中,您有实例变量 succeedRecords 和 failedRecords 。为什么不将这些静态类的实例变量设为静态,以便您可以使用ThirdPartyApiHandler.OperationResult.successfulRecords访问它们。您甚至可以为变量设置静态 getter 和 setter。


OperationResult and OperationInput are defined as static inner class.

与流行的看法相反,没有“静态内部类”这样的东西:这根本没有意义,当嵌套类是静态的时,没有“内部”和“外部”类,所以它不能是“静态内部”。

这个SO question 中挑选出来。阅读第一个答案。我认为这将回答你所有的问题。

于 2013-08-14T09:45:36.657 回答
0
Is above interface a bad design?

很简单,是的。

任何逻辑放入 aninterface在语义上是不正确的。接口向消费者公开功能——这是它的单一目的,不应被淡化。

考虑在基实现类中实现任何通用功能并使用继承,或者在一个或多个服务中并使用组合,在您的不同接口实现中。

编辑——引自 Joshua Bloch 的Effective Java

当一个类实现一个接口时,该接口充当一种可用于引用该类实例的类型。因此,一个类实现了一个接口应该说明客户端可以对类的实例做什么。为任何其他目的定义接口是不合适的。

于 2013-08-14T10:12:17.663 回答