需要的建议:JAVA接口中的静态方法

需要的建议:JAVA接口中的静态方法,java,interface,methods,static,Java,Interface,Methods,Static,我有一个类正在处理将各种消息打印到控制台中,让我们调用这个类ConsoleMessages.java。这个类是公共的和抽象的,它的所有方法都是公共的和静态的 我想为这个类创建一个接口(我们称它为PrintMessages)。我的意思是,ConsoleMessages.java将实现PrintMessages 问题是,JAVA不支持接口中的静态方法 你建议我做什么 如果您发现自己需要在实用程序类上定义接口,那么是时候重新考虑您的设计选择了。您的ConsoleMessages类似乎已经超出了最初作为

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

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

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


你建议我做什么

如果您发现自己需要在实用程序类上定义接口,那么是时候重新考虑您的设计选择了。您的ConsoleMessages类似乎已经超出了最初作为“通用实用程序函数”的转储场地的使用范围


简短的回答?重构时间。

如果您发现自己需要在实用程序类上定义接口,那么是时候重新考虑您的设计选择了。您的ConsoleMessages类似乎已经超出了最初作为“通用实用程序函数”的转储场地的使用范围

简短的回答?重构时间。

  • 使用所需的方法创建
    PrintMessages
    界面

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

  • 强制执行
    ConsoleMessages
    实例化为一个实例。这可以通过多种方式实现,可以自己完成,也可以使用一个新的工具

      • 使用所需的方法创建
        PrintMessages
        界面

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

      • 强制执行
        ConsoleMessages
        实例化为一个实例。这可以通过多种方式实现,可以自己完成,也可以使用一个新的工具


      在接口中确实没有强烈的反对静态方法的论据。不会有坏事发生

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

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

      在接口中并没有针对静态方法的强烈争论。不会有坏事发生

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

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

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

      静态方法只能使用确切的类名(或者某些子类的名称)来调用,使用接口来实现这一点是没有意义的

      因此,您有两种选择:

      • 扔掉你的接口,继续使用静态方法
      • 使所有方法(或者至少是接口中应该包含的方法)成为非静态的,使实现类成为非抽象的。要调用它们,则需要类的对象(实现此接口)

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

      静态方法只能使用确切的类名(或者某些子类的名称)来调用,使用接口来实现这一点是没有意义的

      因此,您有两种选择:

      • 扔掉你的接口,继续使用静态方法
      • 使所有方法(或者至少是接口中应该包含的方法)成为非静态的,使实现类成为非抽象的。要调用它们,则需要类的对象(实现此接口)

      是什么让您认为您需要在接口上使用静态方法?请解释您试图实现的目标。由于您在类上调用这些方法,而不是在类的实例上调用这些方法,我认为接口中不需要静态方法。您是在倒退。定义接口,然后实现功能。你所做的一切听起来都是错误的,而且从长远来看不太可能是可测试或可维护的。你想达到什么目的?也许我们可以推荐一种替代设计。是什么让你认为你需要在接口上使用静态方法?请解释您试图实现的目标。由于您在类上调用这些方法,而不是在类的实例上调用这些方法,我认为接口中不需要静态方法。您是在倒退。定义接口,然后实现功能。你所做的一切听起来都是错误的,而且从长远来看不太可能是可测试或可维护的。你想达到什么目的?也许我们可以推荐一种替代设计。这种方法的一个优点是,您可以通过实现接口来实现静态导入的效果。与仅使用静态导入相比,这种方式的优点是导入会影响整个编译单元。与此相反,这种方法只影响一个类,这个类可能是嵌套在顶级类中的私有类。在Java和.NET中,有许多情况下,完全为了使用一个特定接口而存在的方法最终必须是其他类的静态成员,当它们成为接口本身的成员时,会更干净。我认为Java8将有所改进,尽管我还没有使用它。这种方法的一个优点是,您可以通过实现一个接口来实现静态导入的效果。与仅使用静态导入相比,这种方式的优点是导入会影响整个编译单元。与此相反,这种方法只影响一个类,这个类可能是嵌套在顶级类中的私有类。在Java和.NET中,有许多情况下,完全为了处理一个特定接口而存在的方法最终会被终止