gpt4 book ai didi

JAVA:将 String 转换为(动态已知的)原始类型以实例化(动态已知的)类

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:14 27 4
gpt4 key购买 nike

我有一个使用文本文件(要求)的存储库类,这意味着我必须读取字符串并转换它们才能实例化对象。问题是我希望我的存储库类尽可能通用,以便使用它来操作不同的对象类型。

那么,有没有一种(更优雅的)方法可以在运行时动态地将字符串转换为它需要的任何字段(原始)类型,同时避免大量的具有大量 ifs/switches 的 try-catch 结构?

作为一个简短的简化版本,我希望 objectA.txt 只包含 objectA 的信息,对于 objectB.txt 也是如此,而我的存储库代码可以处理这两者:

Repository repoA = new Repository("objectA.txt", <list of Types for A>);输入A a=repoA.getOne();

Repository repoB = new Repository("objectB.txt", <List of Types for B>);输入B b=repoB.getOne();

我有什么:

public class FileRepository extends InMemoryRepository{
private String fileName;
private List<Class> types;

public FileRepository(String fileName, List<Class> types) {
//@param types
// - list containing the Class to be instantiated followed by it's field types
super();
this.fileName = fileName;
this.types=types;
loadData();
}

private void loadData() {
Path path = Paths.get(fileName);

try {
Files.lines(path).forEach(line -> {
List<String> items = Arrays.asList(line.split(","));

//create Class array for calling the correct constructor
Class[] cls=new Class[types.size()-1];
for (int i=1; i<types.size(); i++){
cls[i-1]=types.get(i);
}

Constructor constr=null;
try {
//get the needed constructor
constr = types.get(0).getConstructor(cls);
} catch (NoSuchMethodException e) {
//do something
e.printStackTrace();
}
//here is where the fun begins
//@arg0 ... @argn are the primitives that need to be casted from string
//something like:
//*(type.get(1))* arg0=*(cast to types.get(1))* items.get(0);
//*(type.get(2))* arg1=*(cast to types.get(2))* items.get(1);
//...

Object obj= (Object) constr.newInstance(@arg0 ... @argn);

});
} catch (IOException ex) {
ex.printStackTrace();
}
}

P.S.:我是一个JAVA新手,所以请尽可能简单的解释。

最佳答案

手头没有 IDE,所以我希望这是有意义的:

private static final Map<Class, Function<String, ?>> parsers = new HashMap<>();

static {
parsers.put(Long.class, Long::parseLong);
parsers.put(Integer.class, Integer::parseInt);
parsers.put(String.class, String::toString);
parsers.put(Double.class, Double::parseDouble);
parsers.put(Float.class, Float::parseFloat);
// add your own types here.
}

public <T> T parse(Class<T> klass, String value) {
// add some null-handling logic here? and empty values.
return (T)parsers.get(klass).apply(value);
}

然后当您需要为构造函数创建参数时:

parameters =
IntStream
.range(0, cls.size-1)
.map(i -> (Object)parse(types.get(i), items.get(i)))
.toArray(Object[]::new);

关于JAVA:将 String 转换为(动态已知的)原始类型以实例化(动态已知的)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36089551/

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