Java接口 - 普通接口中的常量和静态类

时间:2013-08-14 09:34:33

标签: java

请考虑以下界面。

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. 我已阅读有关常量接口的信息。但是在这种情况下,我在普通接口中定义了常量,它们在所有实现中都必须相同,并且将在这些实现中使用。

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

4 个答案:

答案 0 :(得分:4)

  

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

没关系,因为它们不会在其他任何地方使用。如果他们比我更愿意将它们放在不同的课程中那么长。

  

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

这是宣布这样一个领域的好地方。

答案 1 :(得分:4)

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

我建议你这个讲座:Java Tip 75: Use nested classes for better organization

请注意,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 
}

答案 2 :(得分: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;
} 

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


OperationResult and OperationInput are defined as static inner class.

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

this问题提到上面。阅读第一个答案。我想这会回答你所有的问题。

答案 3 :(得分:0)

Is above interface a bad design?

非常简单,是的。

interface中放置任何逻辑在语义上是不正确的。界面向消费者公开功能 - 这是它的唯一目的,不应该被稀释。

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

编辑 - 引自Joshua Bloch的Effective Java

  

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