21

是否有一些模板或其他东西可以通过访问包装成员来实现 iterface 方法?

例如,假设我有

public class MyClass implements List<Something> {

    private final List<Something> core;

...
}

现在我想List<Something>通过将调用传递给 Wrapped like来实现

@Override
public int size() {
    return core.size();
}

等等。

4

3 回答 3

28

有。使用源菜单->生成委托方法...

于 2013-03-13T21:48:57.003 回答
8

我将多说一点关于“生成委托方法”重构如何创建像您描述的转发类。

您创建一个可选择实现接口的新类,并为它提供一个具有您想要删除的类型的字段,例如:

public class NewClass implements ThatInterface {
  private final ThatInterface delegate;

  public MyClass(ThatInterface delegate) {
    this.delegate = delegate();
  }
}

然后应用 Eclipse 重构。(Cmd-3 deleg... 是访问它的一种简单方法。)选中新字段的复选框。它的所有方法都将作为委托添加。

(我认为,在 Eclipse 氧气的重构中存在一个错误,它将default从接口上带有该关键字的方法中复制关键字。您可能需要删除该关键字。)

因此,对于 List 的委托,重构产生:

public class NewClass {
   private final List<String> delegate;

   public NewClass(List<String> delegate) {
       this.delegate = delegate;
   }


   public void forEach(Consumer<? super String> action) {
       delegate.forEach(action);
   }
   public int size() {
       return delegate.size();
   }
   public boolean isEmpty() {
       return delegate.isEmpty();
   }
   public boolean contains(Object o) {
       return delegate.contains(o);
   }

等等...

于 2018-04-09T22:22:48.763 回答
1

在 Luna 中测试。

使用快捷方式Alt- Shift- SM2次。按Enter

于 2016-04-15T06:38:17.793 回答