我喜欢在java中创建数据库表的类表示。 列被设计为泛型类,以便它可以处理表列可能具有的所有不同数据类型。
public class TableColumn<T> {
...
}
一个表有0 ... n TableColumns,所以我的表类看起来像这样:
public class Table {
protected ArrayList<TableColumn<T>> columns =
new ArrayList<TableColumn<T>>();
...
}
我们的想法是以下列方式添加列。
Table t = new Table();
t.addColumn(String.class);
t.addColumn(Integer.class);
t.addColumn(Date.class);
t.addColumn(String.class);
然后我可以通过以下方式操作数据:
String a = t.Cols(2).Row(3);
t.Col(2).Row(3) = "b";
但是我正在以我目前的实现方式失去类型安全性......我的问题是如何实现列,因为列可能获得不同的数据类型。
有人有线索吗?
答案 0 :(得分:0)
如果类型组合数量有限,您可以使用接口作为这些组合。这将使您能够以相同的方式存储列,并且您不需要任何特殊的铸件。
t.addColumn(MyInterface.class);
另一种方法仍然不会像你想要的那样干净但是有点不可避免,就是使用一个新的类,它允许你承担一些铸造和类型检查的负担
示例:
public static class MyWrapper{
Class<?>[] validPossibleClasses;
Object o;
public MyWrapper(Class<?> ...classes){
this.validPossibleClasses = classes;
}
public boolean validateClass(Class<?> clazz){
for (Class<?> c : validPossibleClasses){
if (!c.isAssignableFrom(clazz))
return false;
}
return true;
}
public void set(Object o) throws Exception{
if (!validateClass(o.getClass()))
throw new Exception("Bad Cast");
this.o = o;
}
public String getString(){
return (String) o;
}
public Integer getInt(){
return (Integer) o;
}
...
// more specific getters
}
用法就像这样
String a = t.Cols(2).Row(3).getString();
t.Col(2).Row(3).set("b");
答案 1 :(得分:0)
为什么不为每个表创建一个不同的对象?类似的东西:
带有字段的职业玩家:
String name;
int points;
int number;
Class Stadium with fields:
String location;
Date dateBuilt;
Class team with fields:
String name;
ArrayList<Players> roster;
然后你可以只保存列表或arraylist中的所有值,并将它们与数据库表分开,而不必猜测你所在的表。你必须保留更多的对象,但你会能够更多地了解你正在处理的事情。