【问题标题】:How to store type in a Java Tuple implementation如何在 Java 元组实现中存储类型
【发布时间】: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,从intStringSomeClass

Object Creation。如果 Java 不支持在 Object 声明中使用变量类型,那么这个问题的整个目标就是没有实际意义。

我的问题是:如何在数据结构中存储类型信息(如List&lt;String&gt;)?

【问题讨论】:

  • 您是否考虑过使用类似 Jackson 的工具将地图绑定到 pojos 或为您遍历路径?我的意思是重新思考您要解决的问题。
  • 为什么?一个对象包含它自己的类型。你不需要一双。
  • 详细说明 EJP 的注释,对象有一个getClass() 方法,你可以一直使用instanceof
  • @DavidEhrmann 我试图在主要应用程序功能中抽象出一堆instanceof 检查。此数据中给定对象的类型只有有限数量的可能性。这个想法是返回一对类型和对象。也可能有不同或更好的方法来做到这一点......
  • 这感觉像是XY Problem

标签: java types tuples


【解决方案1】:

不需要一对。一个对象已经包含它自己的类型。在我看来,您只需要这样:

public Object findDataEntry(Map<String, Object> map, String path)
{
    Object obj;
    while ((obj = map.remove(path)) != null) {
        if (obj instanceof Map) {
            map = (Map<String, Object>) obj;
        } else {
            break;
        }
    }
    return obj;
}

【讨论】:

    猜你喜欢
    • 2013-11-21
    • 2020-07-14
    • 1970-01-01
    • 2019-09-20
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 2012-03-09
    相关资源
    最近更新 更多