支持功能接口重构的注释

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的签名是不可取的。但是,我觉得现在的工作流程可以改进:

例如,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