【发布时间】:2023-03-17 08:20:02
【问题描述】:
我希望创建一个数据结构来以结构化格式存储 Object 及其实际类型。我正在处理数据,其中所有内容都以Objects 的形式传递并以这种形式传入。
我希望要么适应Apache Commons Pair,要么构建一个数据结构类。
数据以Map<String, Object> 的形式进入应用程序。这个Map 可以嵌套得很深,所以我正在研究一个函数,它在给定路径字符串的情况下遍历Map。该字符串包含嵌套地图中每一层的键,以. 分隔。例如,路径字符串可能类似于 "path.to.some.field"。
目前,代码库中使用了很多以下类型的习语:
Map<String, Object> data;
if (data.containsKey("someKey")) {
Object obj = data.remove("someKey")
if (obj instanceof Map< ? , ? >) {
Map<String, Object> objMap = (Map<String, Object>) obj;
// repeat...
}
}
虽然这可行,但当您在外部地图data 中移动时,需要进行大量检查和类型转换。正如我所说,我正在研究一个可以将其抽象为遍历Map 的函数的函数。我希望能够返回易于使用的数据。类似的东西:
public DataPair findDataEntry(Map<String, Object> currentMap, String path)
{
// recursive function that walks map.
// It also checks type as well as if the path is valid as it goes along
// returns a structure containing the object and its 'type'
return new DataPart(type, entry)
}
示例用法:
DataPair p = findDataEntry(data, path);
p.left dataentry = new p.left;
dataentry = p.right;
这在 Java 中可能是不可能的,因为它需要动态声明 dataentry 使用存储在 p.left 中的变量类型信息。 p.left 可以是任何type,从int 到String 到SomeClass。
见Object Creation。如果 Java 不支持在 Object 声明中使用变量类型,那么这个问题的整个目标就是没有实际意义。
我的问题是:如何在数据结构中存储类型信息(如List<String>)?
【问题讨论】:
-
您是否考虑过使用类似 Jackson 的工具将地图绑定到 pojos 或为您遍历路径?我的意思是重新思考您要解决的问题。
-
为什么?一个对象包含它自己的类型。你不需要一双。
-
详细说明 EJP 的注释,对象有一个
getClass()方法,你可以一直使用instanceof -
@DavidEhrmann 我试图在主要应用程序功能中抽象出一堆
instanceof检查。此数据中给定对象的类型只有有限数量的可能性。这个想法是返回一对类型和对象。也可能有不同或更好的方法来做到这一点...... -
这感觉像是XY Problem