我有一个抽象类Example和具体的子类来配合它.我使用鉴别器从数据库中提取数据,如下所示:
<resultMap id="ExampleResultMap" class="Example">
<discriminator column="stateCode" javaType="java.lang.String">
<subMap value="AL" resultMap="AlabamaStateResultMap"/>
<subMap value="AR" resultMap="ArkansasStateResultMap"/>
[...]
</discriminator>
</resultMap>
<resultMap extends="ExampleResultMap"
id="AlabamaStateResultMap"
class="AlabamaState"/>
<resultMap extends="ExampleResultMap"
id="ArkansasStateResultMap"
class="ArkansasState"/>
[...]
Run Code Online (Sandbox Code Playgroud)
因此,我有一个AlabamaState对象(抽象Example对象的子类),在他身上没有任何属性.这是设计的,但要点是我没有任何唯一标识对象类型的属性 - 如果没有这种情况我没有理由.
(注意:这些类不是空的,它们是行为的,因此重构它们不是一种选择.)
如何将其保存回数据库?
理想情况下,将是一个Discriminator为ParameterMapS,但似乎并没有成为一个.
据我所知,有许多不受欢迎的解决方案,其中包括:
AL.(请注意,我非常努力地避免在我的所有代码中都需要这个,所以这个= OOD-defeat).可能我会选择第一个选项,但这看起来很荒谬,不是吗?如果iBatis可以创建它,它不应该能够坚持下去吗?我真正需要的是插入的鉴别器.
我运气不好,还是我只是忽略了一些明显的东西?
如果您没有属于子类的属性,则应该考虑删除这些子类并向以前的基类添加枚举,因为子类服务的唯一目的是区分对象的类型(如果我理解正确的话)。为此使用枚举更容易扩展,并且在客户端代码中更优雅(因为您可以打开枚举而不是使用 instanceof 表达式块)。
如果您的子类上有某些操作的特殊实现,您也可以将它们移动到枚举,并将您的基类委托给枚举上的实现。
编辑
这是一个例子:
public interface GreetingStrategy {
abstract String sayHello();
}
enum UserType implements GreetingStrategy {
ADMIN {
@Override
public String sayHello() {
return "hello from admin";
}
},
GUEST {
@Override
public String sayHello() {
return "hello from guest";
}
};
}
class User {
private final GreetingStrategy greetingStrategy;
public User(GreetingStrategy greetingStrategy) {
this.greetingStrategy = greetingStrategy;
}
public String sayHello() {
return greetingStrategy.sayHello();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |