大家好:我正在研究两个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*/
}
}
问题是如何重构一个类,其中唯一的区别是'主'二维数组?钩子方法等在这里会很愚蠢。因为程序没有什么需要修改的。你觉得怎么样?
答案 0 :(得分:2)
这似乎是继承的经典案例。继承的真正目的是代码重用,这正是你在这里得到的。我将所有方法都设置为非静态并对它们执行“Extract Superclass”,将analyze()
和split()
拉入抽象类,并添加抽象getMaster()
或其他类似的,每个类都会覆盖以返回适当的值。
更糟糕的选择 - 出于几个原因,但主要是因为它让你处于“静态土地”,这是一个可怕的地方 - 只需将analyze()
和split()
移入一些第三类,这是一个容纳你的“共享”实用程序方法的地方。
答案 1 :(得分: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,eventhough静态方法分析等。可能你需要你的类中的所有方法和字段都是静态的,你可以使用单个骨架模式。在每个类中,您创建一个类似
的静态方法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)。 希望这有帮助。