我在Java中有一个解析数据库中某些数据的方法
ArrayList<Object> nodeList = new ArrayList<Object>();
public void parseResults() throws SQLException, ListEmptyException, NoRecognisableCharacterException{
// parses records from a query. ONLY ONE COLUMN
while(getResultSet().next()){
for(int i = 1; i <= getNumberOfColumns(); i++){
switch(getColumnType()){
//According to the datatype, I call the proper method get[DataType] of resultSet
case 0:throw new ListEmptyException();
case 4:nodeList.add(getResultSet().getInt(i));break;
case 12:nodeList.add(getResultSet().getString(i).trim());break;
default:throw new NoRecognisableCharacterException();
}
}
}
}
我被告知不要使用ArrayList<Object>
来存储不同类型的数据。我必须创建一个解析相应数据类型的实体。我不想为每个单一数据类型(有很多)重载方法,既不创建仅更改单个get[DataType]
方法的单独类,也不要在switch
循环内创建for
循环,根据数据类型也没有nodeList的多个实例。有没有办法让该方法适用于每种数据类型?在这种情况下,仿制药应该做吗?提前谢谢。
答案 0 :(得分:1)
您可以将结果集对象包装在这样的类中:
public class ObjectWrapper implements Wrapper {
private Object wrappedObject;
public ObjectWrapper(Object wrappedObject) {
this.wrappedObject = wrappedObject;
}
@SuppressWarnings("unchecked")
public <T> T unwrap(Class<T> paramClass) {
return (T) wrappedObject;
}
public boolean isWrapperFor(Class<?> paramClass) {
return paramClass.isInstance(wrappedObject);
}
public static Wrapper wrap(ResultSet rs, int column, int columnType) throws SQLException {
if (columnType == 0) {
return new EmptyListExceptionWrapper();
} else {
return new ObjectWrapper(rs.getObject(column));
}
}
}
和管理例外的类:
public class EmptyListExceptionWrapper implements Wrapper {
@Override
public <T> T unwrap(Class<T> paramClass) throws SQLException {
return null;
}
@Override
public boolean isWrapperFor(Class<?> paramClass) throws SQLException {
return false;
}
}
然后你有一个
ArrayList<Wrapper> wrapper = new ArrayList<Wrapper>;
您的代码将是:
while(getResultSet().next()){
for(int i = 1; i <= getNumberOfColumns(); i++){
wrappers.add(ObjectWrapper.wrap(getResultSet(), i, getColumnType()));
}
}