在java中重构常见的静态方法

时间:2016-01-08 00:18:09

标签: java refactoring static-methods

考虑:

class C1 {
    public static void doWork() {
        // code fragment F1
        doMoreWork();
        // code fragment F2
    }
    private static void doMoreWork() {
        // code fragment F3
    }
}
class C2 {
    public static void doWork() {
        // code fragment F1
        doMoreWork();
        // code fragment F2
    }
    private static void doMoreWork() {
        // code fragment F4
    }
}

请注意doMoreWorkC1中的C2代码不同,但代码在 <{1}}和doWork()中的C1相同。

如何重构此类结构,以便对C2C1.doWork()的调用如上所述,但C2.doWork()的代码不重复?

编辑:请注意,重构后方法必须是静态的。 此外,片段F1和F2实际上是可能具有一个或多个开放上下文的代码片段 - 例如。片段F1打开了一个&#34; {&#34;和结束&#34;}&#34;在片段F2中。

2 个答案:

答案 0 :(得分:1)

您可以创建另一个包含您不想复制的代码的类C

class C {
    public static void f1() { /* code fragment F1 */ }
    public static void f2() { /* code fragment F2 */ }
}

然后,您可以从CC1调用C2的方法。

class C1 {
    public static void doWork() {
        C.f1();
        doMoreWork();
        C.f2();
    }
    private static void doMoreWork() {
        // code fragment F3
    }
}
class C2 {
    public static void doWork() {
        C.f1();
        doMoreWork();
        C.f2();
    }
    private static void doMoreWork() {
        // code fragment F4
    }
}

答案 1 :(得分:0)

您希望将这两种方法保持为静态这一事实会使问题显着复杂化。我甚至怀疑它可以这样做。

为什么你坚持保持静止? 通常,没有理由保持静态,因为您可以轻松地转换为静态&#34;通过创建新实例来创建非静态上下文的上下文。 而不是

C1.doWork();
你刚刚做了

new C1().doWork();

如果你不介意使用非静态方法,你可以这样做:

class C {
        public void doWork() {
            // code fragment F1
            doMoreWork();
            // code fragment F2
        }

        protected abstract void doMoreWork();
}

class C1 extends C {
        protected void doMoreWork() {
            // code fragment F3
        }
}

class C2 extends C {
        protected void doMoreWork() {
            // code fragment F4
        }
}

这只是粗略的,如果编译,我甚至都没试过。