【问题标题】:Advice needed: static methods in JAVA interface需要的建议:JAVA接口中的静态方法
【发布时间】:2011-10-17 15:40:56
【问题描述】:

我有一个处理将各种消息打印到控制台的类,让我们调用这个类 ConsoleMessages.java。这个类是公共的和抽象的,它的所有方法都是公共的和静态的。

我想为这个类创建一个接口(我们称之为 PrintMessages)。我的意思是,ConsoleMessages.java 将实现 PrintMessages。

问题是,JAVA 不支持接口中的静态方法。

你会建议我做什么?

【问题讨论】:

  • 是什么让您认为您需要在接口上使用静态方法?请说明您要完成的工作。
  • 由于你在类上调用这些方法,而不是它的实例,我认为接口中不需要静态方法。
  • 你正在倒退。定义接口然后实现功能。你正在做的事情听起来有各种各样的错误,并且从长远来看不太可能是非常可测试或可维护的。你想要完成什么?也许我们可以推荐一个替代设计。

标签: java interface methods static


【解决方案1】:
  • 使用您想要的方法创建PrintMessages 接口。

  • 使ConsoleMessages 成为实现该接口的类。将所有方法从静态更改为非静态。

  • ConsoleMessages 实例化为singleton。这可以通过多种方式实现,无论是自己做还是使用Dependency Injection framework

【讨论】:

    【解决方案2】:

    对于接口中的静态方法确实没有强烈的争论。不会有什么不好的事情发生。

    一个接口可以有静态字段和静态成员类,因此可以通过它们附加静态方法,尽管有一个额外的间接。

    interface MyService
    
        static public class Factory
            static public MyService get(...)
                return ...;
    
    MyService service = MyService.Factory.get(args);
    

    【讨论】:

    • 这种方式的一个优点是可以通过实现一个接口来达到静态导入的效果。与仅使用静态导入相比,这样做的优点是导入会影响整个编译单元。相比之下,这种方法只影响一个类——它可能是嵌套在顶级类中的私有类。
    • 在 Java 和 .NET 中,在许多情况下,完全为了处理一个特定接口而存在的方法最终必须是其他类的静态成员,而让它们成为接口本身的成员更加清晰。我认为 Java 8 会有所改进,虽然我还没有使用它。
    【解决方案3】:

    如果您发现自己需要在实用程序类上定义接口,那么可能是时候重新审视您的设计选择了。您的 ConsoleMessages 类似乎已经超过了它最初用作“通用实用程序功能”的垃圾场。

    简短回答?重构时间。

    【讨论】:

      【解决方案4】:

      接口用于为对象指定方法(然后将由某个类实现)。这里没有对象,因此不需要接口。

      只能使用确切的类名(或者某些子类的名称)调用静态方法,使用接口来执行此操作没有意义。

      所以,你有两个选择:

      • 扔掉你的界面,继续使用静态方法。
      • 使所有方法(或至少应在接口中的方法)非静态,并使您的实现类非抽象。要调用它们,则需要类的一个对象(实现此接口)。

      【讨论】:

        猜你喜欢
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 2010-12-16
        • 2014-01-01
        • 1970-01-01
        • 2015-06-15
        相关资源
        最近更新 更多