让我们假设我有一个数据库表,如:
Table Building
ID int (primary key)
title varchar
为了获取它,我有一个类似的Java类:
class Building{
private Integer ID;
private String title;
...
}
(如果这有助于你,可以在想象中添加一些JPA注释)。
但是现在,根据实际的建筑,我想执行一些逻辑。
我的第一个想法是创建一个大开关/案例,如:
switch(building.getId()){
case 1:
BuildingA buildingLogic = new BuildingA(building);
break;
case 2:
BuildingB buildingLogic = new BuildingB(building);
break;
...
}
buildingLogic.doBuildingSpecificStuff();
但是这将以无限的开关/案例结束,“读”不太清楚。
我的下一个thougt(已经被Mark Elliot的回答所覆盖)是将实际的Class名称作为附加字段(BuildingClass)写入数据库,并使用一些(对我来说当前未知)java magic,从中创建对象building.getBuildingclass()
字符串,但我已经假设会有某些缺点......
所以我想也许你们可以给我一些关于我的想法的想法或评论。
答案 0 :(得分:2)
假设您确实拥有类名,您可以使用反射来实例化一个新实例,尽管沿着这条路径存在一些安全性和性能风险。
String className = "com.foo.bar.Baz";
// gets the actual class (might throw an Exception if the class doesn't exist)
Class<?> clazz = Class.forName(className);
// probably want to have some common interface these conform to, so
// let's assume you have one, you can test this is the right kind of class
CommonBuildingType buildingLogic = null;
if (CommonBuildingType.class.isAssignableFrom(clazz)) {
// get the constructor to invoke (might throw if no match)
Constructor constructor = clazz.getDeclaredConstructor(Building.class);
// safe to cast, we checked above
buildingLogic = (CommonBuildingType) constructor.newInstance(building);
} else {
// throw an exception?
}
答案 1 :(得分:0)
你应该使用hibernate来更复杂地实现它