简体   繁体   中英

How do i ensure implementation of a public static function with interface

Since Java 8, we are able to define static and default methods in interface. But I need to ensure a public static method say foo() to be implemented in all the classes that implements a particular interface say interface A . How do I do that , or is it at all possible ?

The interface 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();
}

Class 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

}

Class 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

}

Edit 1: Actual case :

I have one public static method getInstance() (returning Singleton instance of that class) in all the implementing classes, and I want to ensure all the future classes other developers write must have that static method implemented in their classes. I can simply use reflection to return that instance by calling the getInstance() method from a static method of the interface, but I wanted to make sure that everyone implements the getInstance() in all the implementing classes.

static methods from interface are not inherited (1). They are inherited in case of a class, but you can not override them (2); thus what you are trying to do is literally impossible.

If you want all classes to implement your method, why not simply make it abstract (and implicitly public ) to begin with, so that everyone is forced to implement it.

Eugene already pointed out that static methods can not be overridden. I suggest that you extract the singleton behavior to a separate interface. For example:

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();
    }
}

Finally you can use any object of type BSingleton to get the singleton object of B .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM