Java接口-普通接口中的常量和静态类
考虑以下接口Java接口-普通接口中的常量和静态类,java,Java,考虑以下接口 public interface ThirdPartyApiHandler { public OperationResult doOperation(OperationInput input); public static class OperationResult { //members of OpeationResult. metrics after file processing private int successf
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
和operationput
被定义为静态类。它们将仅用于实现,而不用于其他任何地方。我在这里看到的优点是——我不必为这两个类创建单独的文件。它们还获得父类的名称空间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)
}
}
}
也
在上面的类中,您有实例变量successfulRecords和failedRecords。为什么不将这些静态类的实例变量也设置为静态,以便您可以使用ThirdPartyApiHandler.OperationResult.successfulRecords访问它们呢。甚至可以为变量设置静态getter和setter
与流行的观点相反,不存在“静态内部类”:这根本没有意义,当嵌套类是静态的时,没有“内部”和“外部”类,因此它不能是“静态内部”类
从上面的问题中挑出。阅读第一个答案。我想这将回答您所有的问题。在接口中嵌套类只是增加名称空间的问题。当创建支持简单数据结构的小型接口时,这种方法有助于组织代码 我向你推荐这个讲座: 请注意,
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
}
很简单,是的。
将任何逻辑放入接口
在语义上是不正确的。接口向消费者公开功能——这是它的唯一目的,不应该被稀释
考虑在基本实现类中实现任何公共功能,并在不同的接口实现中使用继承,或者在一个或多个服务中使用组合
编辑-引用约书亚·布洛赫的
当一个类实现一个接口时,该接口充当一个类型,可用于引用该类的实例。因此,类实现接口应该说明客户端可以对类的实例做什么。为任何其他目的定义接口是不合适的
您的
操作结果
和操作输入
中有什么?操作输入包含用于调用第三方API的成员变量。OperationResult是将第三方API结果转换为可用格式的包装器。@Jitendra。你能完成你问题中的那些课程吗?因此,我们可以考虑适当的设计。OperationResult和operationput被定义为静态内部类。它们不会在其他任何地方使用
,但如果您实现了操作
方法。这个方法的调用方将使用这两种类型,不是吗?是的,我的意思是,它们只会在这个特定接口的实现中使用。不是任何其他无关的类。那么,这个答案是如何解决真正的问题的呢?你只是在评论OP使用的术语,既然你在评论,这应该是一个评论。你所说的“实现接口的所有子类都将共享同一个类”到底是什么意思?静态类的实例成员仍然是实例成员——它们不会在静态类的所有实例之间共享!常量接口反模式更具体地指的是一个接口,它不声明任何方法,只用于向实现它的应用程序提供全局常量。你对常数的使用非常恰当。@Tala,我已经更新了我的问题它们不会在其他任何地方使用
。我的意思是,它们显然会被所有实现使用,并且在类中会有一些引用,这些类使用实现中定义的doOperation
方法。接口不是为所有实现放置常量shared的地方。接口应该只声明契约。当然,除非真正的目的是声明常量供外部客户端使用。我还没有看到有人使用接口与客户机共享常量。它被当作是通过接口泄露的实现细节。@下行者-你认为这个答案的哪个方面没有用处?我不是下流者,而是<代码>……它是单一目的…< /代码>它不是100%真。e、 我真的不明白你的意思,因为标记接口实际上只是向消费者公开功能的一个特例,只是功能不需要方法来实现,例如Java中的“可序列化”。添加了Joshua Bloch的“有效Java”中的一句话,支持我的观点
OperationResult and OperationInput are defined as static inner class.
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
}
Is above interface a bad design?