考虑以下示例:
public interface Greeter {
String greet();
}
public class ExplicitGreeterImpl implements Greeter {
@Override
public String greet() {
return "Hello World!";
}
}
public class ImplicitGreeterImpl {
public String doTheGreeting() {
return "Hello World!";
}
}
private void run() {
System.out.println(new ExplicitGreeterImpl().greet());
Greeter foo = new ImplicitGreeterImpl()::doTheGreeting;
System.out.println(foo.greet());
}
功能接口Greeter
有两种实现。使用该子句实现,而ExplicitGreeterImpl
没有它的实现。尽管如此,它的设计目的是实现,就像.Greeter
implements
ImplicitGreeterImpl::doTheGreeting
Greeter
ImplicitGreeterImpl::doTheGreeting
Greeter
ExplicitGreeterImpl
现在,我想重构Greeter
接口,所以我可以给它传递一个名字:
public interface Greeter {
String greet(String name);
}
我可以通过 Eclipse 提供的Change Method Signature重构来做到这一点(我相信其他 IDE 也有类似的重构)。这会自动更新Greeter
接口的所有实现和使用。实现接收新参数,而用法传递可配置的默认值。这适用于ExplicitGreeterImpl
,但是重构不涉及该ImplicitGreeterImpl::doTheGreeting
方法。因此,赋值
Greeter foo = new ImplicitGreeterImpl()::doTheGreeting;
成为编译时错误。要解决这个问题,我必须手动调整方法的签名ImplicitGreeterImpl::doTheGreeting
。
现在,我了解到在许多情况下自动调整ImplicitGreeterImpl::doTheGreeting
. 但是,我觉得目前的工作流程可以改进:
- Eclipse 不会在重构预览中显示提示将出现编译时错误的警告。
- 应该可以对方法进行注释以阐明它应该实现给定的功能接口。
例如,ImplicitGreeterImpl
可能看起来像这样:
public class ImplicitGreeterImpl {
@Implements(Greeter.class)
public String doTheGreeting() {
return "Hello World!";
}
}
现在,重构工具可以确定ImplicitGreeterImpl::doTheGreeting
应该实现Greeter
,因此,它们可以自动更改其签名。
因此,我的问题是:有没有办法告诉重构工具给定的方法应该实现给定的功能接口?我搜索了上面提出的注释,但没有发现任何有用的东西。