gpt4 book ai didi

java - 在 Java 中为 Request 对象定义集合字段时,更好的做法是什么?

转载 作者:行者123 更新时间:2023-11-30 12:03:51 26 4
gpt4 key购买 nike

我试图找出在 Java 中定义请求对象时哪种方法更好。假设我们有以下两个请求:

// use array for booksNames
class RequestA {
private String requestId;
private String[] booksNames;
}

// use set for booksNames
class RequestB {
private String requestId;
private Set<String> booksNames;
}

所以基本上,我不确定这里哪个更好,假设 booksNames 必须是唯一值的集合,那么为什么不在这里使用 Set。我正在阅读我们的代码库,看到人们正在为此类字段使用数组,这让我感到困惑。 (我找不到那些人,因为他们都离开了公司,所以我在这里问一下)

顺便说一句,我们正在使用 Jackson 对象映射器将 Java Request 对象映射到 Json 字符串。也许这就是原因?

在此先感谢您的帮助,我已经在这个简单的问题上花了几个小时,希望我能从这里的人那里得到一些见解。

最佳答案

JSON array 可以在 Java 中映射为:arrayjava.util.Listjava.util.SetDocumentation说到数组:

An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

最自然的是将它映射到 Java 中的数组。它保持秩序并且简单明了。当您想使用 java.util.Listjava.util.Set 时,您需要知道默认使用哪个实现以及它的副作用是什么。

java.util.Set 的情况下,您需要记住可以更改顺序。所以,如果它很重要 - Set 是一个糟糕的选择。

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Set;

public class JsonApp {

public static void main(String[] args) throws IOException {
String json = "[\"B\",\"A\",\"B\",\"C\",\"A\",\"B\"]";
ObjectMapper mapper = new ObjectMapper();

// array
String[] array = mapper.readValue(json, String[].class);
System.out.println(array.getClass().getName() + ": " + Arrays.toString(array));

// list
List<String> list = mapper.readValue(json, List.class);
System.out.println(list.getClass().getName() + ": " + list);

// set
Set<String> set = mapper.readValue(json, Set.class);
System.out.println(set.getClass().getName() + ": " + set);
}
}

以上代码打印:

[Ljava.lang.String;: [B, A, B, C, A, B]
java.util.ArrayList: [B, A, B, C, A, B]
java.util.HashSet: [A, B, C]

因为,您可以看到 String[]java.util.ArrayList 显示相同的结果,因为 java.util.ArrayList 使用数组在幕后。当您使用 Set 时,输出不保持顺序并删除重复项。

在这种情况下,您需要验证请求并检查客户端是否发送了重复项,您不能使用默认的 Set 映射来做到这一点。此外,Set 的内存占用量大于数组。

关于java - 在 Java 中为 Request 对象定义集合字段时,更好的做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57438457/

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