Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java接口-普通接口中的常量和静态类_Java - Fatal编程技术网

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
    被定义为静态类。它们将仅用于实现,而不用于其他任何地方。我在这里看到的优点是——我不必为这两个类创建单独的文件。它们还获得父类的名称空间

  • 我读过关于常数接口的书。但在本例中,我在普通接口中定义常量,该常量在所有实现中都是相同的,并将在这些实现中使用

  • 我第一次使用这个模式,所以我想得到一些建议

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

    这没关系,因为它们不会在其他任何地方使用。如果它们比我喜欢的长,我会把它们分在不同的班级里

    我读过关于常数接口的书。但在本例中,我定义了普通接口中的常量,该常量在所有实现中都是相同的,并将在这些实现中使用

    这是一个申报此类字段的好地方

    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?