gpt4 book ai didi

java - 在 Java 中将字符串转换为不同类型的良好设计

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:40 24 4
gpt4 key购买 nike

我有一个 Data 类,它以字符串形式存储单个数据,它还存储该数据应转换为的类型,该类型存储为枚举常量(仅允许特定类型)。描述一项的数据对象存储在 DataItem 类中。目的是 Data 对象对应于表中的一个字段,而 DataItem 代表一整行。还值得一提的是,Data 对象是从 DataTemplate 类创建的,该类指定在哪里查找此类数据及其类型(因此每个 Data 的类型应该在编译时已知)。

我希望这个程序在数据库选择方面非常灵活,因此方法“save”来自存储接口(interface),该接口(interface)允许在实现它后使用任何类型的存储(文件/RDB/文档数据库...)。

我想知道有没有一种好方法可以将这些字符串值从数据对象转换为适当的类型,以便我可以将它们保存到数据库中。一个简单的方法是使用这样的东西:

public void save(DataItem dataItem) {
for (Data data : dataItem) {
if (data.getType() == DataType.BOOLEAN) {
// Convert to String to boolean and save
}
else if (data.getType() == DataType.DOUBLE) {
// Convert to String to double and save
}
...
}
}

但这不是一个很好的设计,因为我必须为每次保存的实现重复此代码。它还违反了开放/封闭原则,因为如果我添加一些新类型,我将不得不修改所有保存方法。

我也尝试过使用泛型或反射,但这些实现都不令人满意。

我提出的一个通用解决方案要求用户使用提供的枚举常量之一,但数据类将存储相应类型的类实例,而不是存储枚举常量。这样我仍然可以控制可以使用哪些类型,并且如果选择了错误的类,则会出现编译时错误。这将使我能够实现以这种方式工作的转换器方法。

public <T> T convert(Data data, Class<T> clazz) {
if (data.getType() == Boolean.class) {
// Convert String to Boolean
return (T)
}
else if (data.getType() == Double.class) {
// Convert to String to Double
return (T)
}
...
}

然后我还可以使用类似的模式并将转换方法与允许的数据类型一起存储在 DataType 枚举中。使用每种类型都必须指定的抽象方法。像这样的东西:

public enum DataType {
BOOLEAN(Boolean.class){
@Override
public <T> T convert(Data data, Class<T> clazz) {
return clazz.cast(Boolean.parseBoolean(data.getContent()));
}
},
DOUBLE(Double.class){
@Override
public <T> T convert(Data data, Class<T> clazz) {
return clazz.cast(Double.parseDouble(data.getContent()));
}
},
...;
...
public abstract <T> T convert(Data data, Class<T> clazz);
}

在这种情况下,我只需在添加新类型时修改 DataType 枚举,前提是底层存储具有接受所有允许类型的方法。

最后,我的问题是:1. 有更好的方法吗?2. 如果不是,我应该选择哪种设计?

最佳答案

您可以将转换函数存储在 Map<Class<?>,Function<String,?>> 中 map 。根据Class查找转换函数。创建新类型时向 map 添加新功能。

Map<Class<?>,Function<String,?>> map = new HashMap<>();

<T> T convert(String data, Class<T> clazz) {
return (T) map.get(clazz).apply(data);
}

或者,您可以创建自己的 DataType类,并为每种类型创建单例实例,并为每个单例添加适当的转换方法:

public abstract class DataType<T> {
<T> T fromString(String data);
}

public final static DataType<Boolean> BOOLEAN = new DataType<Boolean>() {
Boolean fromString(String data) {
...
}
};

// ...

Data data = ...
Object value = data.getType().fromString(data.getContent())

您可以向 DataType 添加其他字段和方法,视情况而定。

关于java - 在 Java 中将字符串转换为不同类型的良好设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46414681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com