请考虑以下界面。
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;
}
上面的界面设计不好吗?
OperationResult
和OperationInput
被定义为静态类。它们仅用于实现而不是其他任何地方。我在这里看到的优点是 - 我不必为这两个类创建单独的文件。他们也获得了父类的命名空间。
我已阅读有关常量接口的信息。但是在这种情况下,我在普通接口中定义了常量,它们在所有实现中都必须相同,并且将在这些实现中使用。
我第一次使用这种模式,所以想得到建议。
答案 0 :(得分:4)
OperationResult和OperationInput被定义为静态内部类。 不会在其他任何地方使用它们。
没关系,因为它们不会在其他任何地方使用。如果他们比我更愿意将它们放在不同的课程中那么长。
我已阅读有关常量接口的信息。但在这种情况下,我在普通接口中定义常量,在所有实现中绑定并将在这些实现中使用。
这是宣布这样一个领域的好地方。
答案 1 :(得分: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
}
答案 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
当类实现接口时,接口充当可用于引用类实例的类型。因此,类实现接口应该说明客户端可以对类的实例做什么。为任何其他目的定义接口是不合适的。