ale*_*lex 1 java concreteclass static-factory
我正在查看 Java 中内置的一个接口,并注意到它有返回其自己类型的对象的方法。
具体来说,IntStreamrange接口有一个返回 IntStream 对象(即实现 IntStream 的某个对象)的方法。该方法只需导入接口即可使用,如下:
import java.util.stream.IntStream;
class Foo {
public static void main(String[] args) {
IntStream s = IntStream.range(0,10);
System.out.println(s.average());
}
}
Run Code Online (Sandbox Code Playgroud)
因此,似乎“在幕后”界面正在为我选择一个实现,并允许我使用它。这究竟是如何运作的?
至关重要的是,我将如何做同样的事情?如果我想导出一个可以实例化其自己类型的对象的接口,以便用户可以简单地导入我的接口并拖动我的实现,我该怎么做?或者这只是Java内置接口的特殊特权?
range是接口的静态方法IntStream,返回实现 的类的实例IntStream。看看下面的例子。
public interface MyInterface {
public static class MyClass implements MyInterface {
@Override
public void doSomething() {
System.out.println( "i'm an implementing class!" );
}
}
public static MyInterface createMagicInstance() {
return new MyClass();
}
public void doSomething();
}
public class Test {
public static void main( String[] args ) {
MyInterface mi = MyInterface.createMagicInstance();
mi.doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的示例中,我尝试设计一些独立的东西,但实现createMagicInstance可能会有所不同。您不需要将返回类型实现为静态内部类。我建议您查看IntStreamOpenJDK类的源代码:https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/stream/IntStream .java