-1

大家好:我正在开发两个java程序,实际上两者之间的唯一区别是定义二维数组的开始语句。我在下面的例子中大大缩短了代码:

public class Qwerty {
    /** this is what needs to be replaced */
    private static char master[][] = {
        QwertyKbd.lIndex,
        QwertyKbd.lMiddle,
        QwertyKbd.lRing,
        QwertyKbd.lPinky,
            /** and so forth in this fashion */
    };

    public static int[] analyze(String file) {
    }

    public static void split(char c) {
    }
}

和这里的第二堂课:

 public class Dvorak{
        /** this is what needs to be replaced */
        private static char master[][] = {
            /** various definitions, eliminated for conciseness */
        };

        public static int[] analyze(String file) {
            /** this is the same*/
        }

        public static void split(char c) {
            /** this is the same*/
        }
    }

问题是我如何重构以获得唯一不同的是“主”二维数组的类?钩子方法等在这里会很愚蠢。因为程序没有任何需要修改的地方。你怎么看?

4

2 回答 2

2

看来这是继承的经典案例。继承的真正目的是代码重用,这正是您在这里得到的。我会让所有方法都变成非静态的,并对它们做一个“提取超类”,拉analyze()split()抽象类,并添加一个抽象getMaster()或类似的东西,每个类都会覆盖它以返回适当的值。

更糟糕的选择——出于几个原因,但主要是因为它把你留在“静止的土地”,这是一个可怕的地方——将简单地移动analyze()split()进入一些三等舱,这是一个容纳你的“共享”的地方像这样的实用方法。

于 2012-12-16T03:08:41.940 回答
1

如果你的类在不同的项目中,你不能这样做但是如果它们是项目的一部分,你可以为你的所有类创建一个抽象类或超类:Qwerty、Dvorak...例如,你创建一个抽象

public class CustomAbstract{
    protected char master[][];
    public int[] analyze(String file){return null;};
    public void split(char c){};
}

然后在你的类中,你扩展了这个抽象类

public class Qwerty extends CustomAbstract{
    public Qwerty(){
        //master = ...;
    }
    //your code
}

当您重构 CustomAbstract 中的 master 字段时,其他类中的所有 master 字段也会被重构。

上面代码的问题是你不能使用静态字段主,即使静态方法分析等。可能你需要类中的所有方法和字段都是静态的,你可以使用单骨架模式。在每个类中,您都创建一个这样的静态方法

public class Qwerty extends CustomAbstract{
    //your code
    static Qwerty instance = new Qwerty();
    public static Qwerty getInstance(){
        return instance;
    }
}

然后可以使用 Qwerty.getInstance().analyze(String) 而不是使用 Qwerty.analyze(String) 希望对您有所帮助。

于 2012-12-16T03:44:02.470 回答