我有一系列共享公共代码的类A
,B
,C
...(总共几十个)。每个班级A
,B
,C
......可以有多个实例。我计划创建一个包含该代码的超类Abstract
。
问题是,常见的东西适用于在每个类(不是每个实例)的基础上唯一的对象。这是当前由A
,B
,C
解决...每个都有一个带有相应值的静态字段。显然,当我将功能重构为Abstract
时,需要将其更改为其他内容。
在实践中,它目前看起来像这样(请注意,实际类型不是String
,这仅用于演示目的):
public class A implements CommonInterface {
private static final String specificVar = "A";
@Override
public void common() {
specificVar.contains('');
}
}
public class B implements CommonInterface {
private static final String specificVar = "B";
@Override
public void common() {
specificVar.contains('');
}
}
我迄今为止提出的最好的想法是在Map<Class<? extends Abstract>,K>
中K
Abstract
(其中A
是相关类型)静态字段,{{1 }},B
,C
...每个都包含一个静态初始化块,用于将相关值放入地图中。但是,我不相信这是最好的。
请注意,我没有使用任何DI框架。
所以,在子类中包含的代码方面最简洁的方法是重构A
,B
,C
中的静态字段。 。由公共代码处理,而不牺牲现场访问效率?
答案 0 :(得分:0)
也许你想要的是一个枚举。
enum MyInstances implements MyInterface {
A {
fields and methods for A
}, B {
fields and methods for B
};
common fields for all MyInstances
common methods for all MyInstances
}
// To lookup an instance
MyInstances mi = MyInstances.valueOf("A");
答案 1 :(得分:0)
由于您没有显示任何源代码,我们无法确定静态字段的使用是好还是坏的设计选择。
考虑到子类使用静态字段确实是一个很好的设计选择,在超类中使用公共代码来访问它们的第一种方法是调用将在子类中实现的抽象方法。
示例:
public abstract class SuperClass {
public void processCommonLogic() {
// Common logic
// Execute specific logic in subclasses
processSpecificLogic();
}
public abstract void processCommonLogic();
}
public class ASubClass extends SuperClass {
public static int SPECIFIC_SUBCLASS_CONSTANT = 0;
public void processSpecificLogic() {
// Specific subclass logic
doSomethingWith(ASubClass.SPECIFIC_SUBCLASS_CONSTANT);
}
}
答案 2 :(得分:0)
您可以使用Template Method Pattern。
在抽象类中定义抽象方法getValue()
,并在需要值的任何地方在抽象类中使用。然后,每个子类只需要实现getValue方法并为该子类返回正确的值。