0

考虑以下示例:

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没有它的实现。尽管如此,它的设计目的是实现,就像.GreeterimplementsImplicitGreeterImpl::doTheGreetingGreeterImplicitGreeterImpl::doTheGreetingGreeterExplicitGreeterImpl

现在,我想重构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,因此,它们可以自动更改其签名。

因此,我的问题是:有没有办法告诉重构工具给定的方法应该实现给定的功能接口?我搜索了上面提出的注释,但没有发现任何有用的东西。

4

2 回答 2

0

我一直在寻找答案,但似乎没有使用注释的解决方案。然而,当我提出这个问题时,我想到了一个特定的用例:我想在一个文件中写下同一功能接口的许多不同实现。事实上,这个问题有一个解决方案,它也适用于自动重构工具:

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());
}

也可以看看:

于 2016-11-06T18:24:19.777 回答
0

是的:您需要实现接口。如果您可以添加链接到接口的注释,为什么不让您的类实现它呢?

于 2016-09-25T20:23:41.183 回答