有没有一种方法可以在没有默认构造函数的情况下内联接口的实现?为了更好地理解我的问题,让我们说我有一个接口MyInterface和一个名为MyImplementation的实现。
public interface MyInterface
{
void myFunction();
}
public MyImplementation implements MyInterface
{
private final String someString;
public MyImplementation(String someString)
{
this.someString = someString;
}
public void myFunction()
{
// do something.
}
}
有没有办法内联MyImplementation?如果我没有必要将someString传递给实现的构造函数,我可以说 -
MyInterface myInterface = new MyInterface() {
public void myFunction()
{
// do something
}
};
答案 0 :(得分:2)
如果你的问题是如何创建一个引用你在构造函数中设置的对象的匿名类,你可以"内联"通过在同一方法中定义匿名类和引用final
局部变量的实现,如下所示:
private final String someString = ...; // That's the string that you used to init in the constructor; init it here
MyInterface myInterface = new MyInterface() { // That's the code that you wanted to have
public void myFunction()
{
System.out.println(someString); // This is allowed, because someString is final
}
};
在幕后,Java编译器将生成一个看起来非常类似于MyImplementation
类的类,创建一个看起来像MyImplementation
构造函数的构造函数,并将someString
传递给它。
答案 1 :(得分:0)
Anonymous classes是执行此操作的“旧”方式。对于只有一种方法的接口,Java 8中的新方法是使用lambda expressions。
例如,假设您要打印someString
。旧方式:
MyInterface o = new MyInterface() {
@Override
public void myFunction() {
System.out.println(someString);
}
};
新方式:
MyInterface o = () -> System.out.println(someString);
你甚至不需要用lambdas进行someString
决赛!它足够好,它是“有效的最终”,这基本上意味着它可以被标记为final
并且仍然被编译。