在Eclipse或Intellij中解封装重构?

dev*_*ium 4 java eclipse refactoring intellij-idea

考虑一个包装类W,包装C,这意味着对于大部分属性C,有一个记者的属性AW,它的逻辑包括不外乎代表团更多CA.使用下图所示的草图可以最精确地描述这种情况:

class W {
    private C c;

    getX() { return c.getX(); }
    getY() { return c.getY(); }
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是,我已经决定,我wan't摆脱getX(),我宁愿无论是作为一个过渡步骤,把C c为公众,为所有调用的代码W做一个w.c.getX()w.c.getY()或可选择地把创建W.getC(),并有所有的呼叫getX(),并getY()通过它去.

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

Dan*_*nov 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

将光标放在声明上W.c.然后选择Refactor | 删除米德曼.结果让你到达你想要的地方的一半:

之后:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,你可以介绍类型的变量CUsesW.将光标放在其中一个调用上w.getC()并将其内联:Refactor | 内联...(Ctrl-Alt-N是默认快捷方式),选择内联所有实例.它会让你这样:

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

最后W完全摆脱你可能比我更好的答案,但现在这项工作变得更加容易.