支持功能接口重构的注释
Annotation to support refactoring of a functional interface
考虑以下示例:
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
使用 implements
子句实现 Greeter
,而 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
,因此,它们可以自动更改其签名。
因此,我的问题是:有没有办法告诉重构工具给定的方法应该实现给定的功能接口?我搜索了上面提出的注释,但没有找到任何有用的东西。
是:您需要实现接口。
如果您可以添加链接到界面的注释,为什么不让您的 class 实现它?
我一直在寻找答案,但似乎没有使用注释的解决方案。但是,在问这个问题时,我想到了一个特定的用例:我想在一个文件中写下同一功能接口的许多不同实现。事实上,这个问题有一个解决方案,它也适用于自动重构工具:
public interface Greeter {
String greet();
}
public enum EnumGreeterImpl implements Greeter {
GREETER1 {
@Override
public String greet() {
return "Hello World!";
}
},
GREETER2 {
@Override
public String greet() {
return "Foo bar";
}
},
}
private void run() {
Greeter foo = EnumGreeterImpl.GREETER1;
System.out.println(foo.greet());
}
另请参阅:
- Lambdas in the classical Operation enum example
考虑以下示例:
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
使用 implements
子句实现 Greeter
,而 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
,因此,它们可以自动更改其签名。
因此,我的问题是:有没有办法告诉重构工具给定的方法应该实现给定的功能接口?我搜索了上面提出的注释,但没有找到任何有用的东西。
是:您需要实现接口。 如果您可以添加链接到界面的注释,为什么不让您的 class 实现它?
我一直在寻找答案,但似乎没有使用注释的解决方案。但是,在问这个问题时,我想到了一个特定的用例:我想在一个文件中写下同一功能接口的许多不同实现。事实上,这个问题有一个解决方案,它也适用于自动重构工具:
public interface Greeter {
String greet();
}
public enum EnumGreeterImpl implements Greeter {
GREETER1 {
@Override
public String greet() {
return "Hello World!";
}
},
GREETER2 {
@Override
public String greet() {
return "Foo bar";
}
},
}
private void run() {
Greeter foo = EnumGreeterImpl.GREETER1;
System.out.println(foo.greet());
}
另请参阅:
- Lambdas in the classical Operation enum example