在Eclipse或Intellij中解封装重构?

时间:2012-12-13 00:24:35

标签: java eclipse refactoring intellij-idea

考虑一个包装类W,包装C,这意味着对于C的大多数属性,A上有一个对应的属性W,它的逻辑只包括授权C的{​​{1}}。使用下面的草图可以最精确地描述这种情况:

A

麻烦的是,我已经决定我不想摆脱class W { private C c; getX() { return c.getX(); } getY() { return c.getY(); } } ,而我更愿意将getX()作为公共场所的一个暂时的步骤,让所有的调用C c代码执行Ww.c.getX()或者创建w.c.getY(),并拨打W.getC()getX()的所有电话通过它。

这一切归结为“无封装”的重构。在Eclipse或Intellij中是否有任何执行这项急需的任务?

2 个答案:

答案 0 :(得分: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的声明上。然后选择重构|删除Middleman 。 结果让你到达目的地的一半:

<强>后

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

然后,您可以在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是你可能比我更好的答案,但现在这项工作变得更加容易。

答案 1 :(得分:3)

  1. 编写新的getC()方法。
  2. getX()重写为return getC().getX()
  3. 内联getX()
  4. y同样如此。