4

考虑一个包装类W,wrapping C,这意味着对于 的大多数属性C,都有一个对应的属性AW其逻辑无非是委托给CA。下图可以最准确地描述这种情况:

class W {
    private C c;

    getX() { return c.getX(); }
    getY() { return c.getY(); }
}

问题是我已经决定我不想摆脱getX(),我宁愿作为一个暂时的步骤C c公开,让所有的调用代码Wdo aw.c.getX()或者w.c.getY()或者或者把 create a W.getC(),并有所有的电话,getX()getY()通过它。

这一切归结为“非封装”重构。在 Eclipse 或 Intellij 中是否有任何东西可以执行这个急需的任务?

4

2 回答 2

6

使用 IntelliJ,您可以使用Remove Middleman重构。

考虑:

之前

public class W {
    private C c;

    Object getX() { return c.getX(); }
    Object getY() { return c.getY(); }
}

public class C {
    private Object x;
    private Object y;

    public Object getX() {
        return x;
    }

    public Object getY() {
        return y;
    }
}

public class UsesW {
    W w;
    public void useW() {
        Object x = w.getX();
        Object y = w.getY();
    }
}

将光标放在W.c. 然后选择重构 | 删除中间人。结果使您到达想要的位置的一半:

之后

public class W {
    private C c;

    public C getC() {
        return c;
    }
}

/* class C is unchanged */

public class UsesW {
    W w;
    public void useW() {
        Object x = w.getC().getX();
        Object y = w.getC().getY();
    }
}

然后你可以引入一个 in 类型的C变量UsesW。将光标放在其中一个调用上w.getC()并将其内联:重构 | 内联...Ctrl-Alt-N是默认快捷方式),选择内联所有实例。它会给你留下这个:

public class UsesW {
    W w;
    public void useW() {
        final C c = w.getC();
        Object x = c.getX();
        Object y = c.getY();
    }
}

最终完全摆脱W是您可能比我回答得更好的问题,但现在这项工作变得容易得多。

于 2012-12-13T00:38:17.380 回答
3
  1. 写下你的新getC()方法。
  2. 改写getX()return getC().getX().
  3. 内联getX()

也是如此y

于 2012-12-13T00:26:31.873 回答