如何确保使用接口实现公共静态函数

时间:2018-04-03 19:08:14

标签: java interface java-8

从Java 8开始,我们可以在接口中定义静态和默认方法。但是我需要确保公共静态方法说foo()在所有实现特定接口的类中实现interface A。我该怎么做,或者它是否可能?

界面A:

package com.practice.misc.interfacetest;

public interface A {
    public static Object foo(); //Eclipse shows error : 'This method requires a body instead of a semicolon'
    String normalFunc();
}

B组:

package com.practice.misc.interfacetest;

public class B implements A{

    @Override
    public String normalFunc() {
        return "B.normalFunc";
    }
//I need to ensure that I have to define function foo() too

}

C类:

package com.practice.misc.interfacetest;

public class C implements A{

    @Override
    public String normalFunc() {
        return "C.normalFunc";
    }
//I need to ensure that I have to define function foo() too

}

编辑1: 实际案例:

我在所有实现类中都有一个公共静态方法getInstance()(返回该类的Singleton实例),我想确保其他开发人员编写的所有未来类必须在其类中实现该静态方法。我可以通过从接口的静态方法调用getInstance()方法来简单地使用反射来返回该实例,但我想确保每个人都在所有实现类中实现getInstance()

2 个答案:

答案 0 :(得分:8)

来自接口的

静态方法继承(1)。它们是在类的情况下继承的,但是你不能覆盖它们(2);因此,你想要做的事实上是不可能的。

如果您希望所有课程都实现您的方法,那么为什么不简单地将其设为abstract(并隐式public),以便每个人都强制来实施它。

答案 1 :(得分:0)

Eugene已经指出静态方法不能被覆盖。我建议你将单例行为提取到一个单独的接口。例如:

public interface A {
    String normalFunc();
}

public class B implements A {
    @Override
    public String normalFunc() {
        return "B.normalFunc";
    }
    // TODO add getInstance for singleton
}

public interface Singleton {
    // TODO extensive javadoc to describe expected singleton behavior
    A getInstance();
}

public class BSingleton implements Singleton {
    @Override
    public A getInstance() {
        return B.getInstance();
    }
}

最后,您可以使用BSingleton类型的任何对象来获取B的单例对象。