在Java中为请求对象定义集合字段时,更好的做法是什么?
我试图找出在Java中定义请求对象时哪种方法更好。假设我们有以下两个请求:在Java中为请求对象定义集合字段时,更好的做法是什么?,java,json,interface,request,jackson,Java,Json,Interface,Request,Jackson,我试图找出在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> bo
// 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;
}
//使用数组作为名称
类请求{
私有字符串请求ID;
私有字符串[]名称;
}
//对书名使用set
类请求B{
私有字符串请求ID;
私人书名;
}
所以基本上,我不确定这里哪个更好,假设booksNames
必须是唯一值的集合,那么为什么不在这里使用Set
。我正在阅读我们的代码库,看到人们正在使用数组来处理这样的字段,这让我很困惑。(我找不到这些人,因为他们都离开了公司,所以我在这里询问)
顺便说一句,我们使用Jackson对象映射器将Java请求对象映射到Json字符串。也许这就是原因
提前感谢您的帮助,我已经在这个简单的问题上花了几个小时,希望我能从这里的人那里得到一些见解。使用第二种方法,因为您不需要担心java.lang.ArrayIndexOutOfBoundsException:)顺便说一句,您也可以使用json对象作为第二种方法,如下所示: 我们使用Jackson对象映射器将Java请求对象映射到 Json字符串。也许这就是原因 这不可能是杰克逊处理Set/List的原因
使用Array/List Vs Set的一个可能的理由是,假设您希望验证请求并让使用者知道他们发送了重复的Bookname(通过HTTP 400),而不是静默地清理数据并继续操作。哪一个更好可能取决于代码中其他地方对
booknames
的使用。数组和某些集合类型之间的区别主要在于集合类型不能保存诸如int
之类的基元值,但需要诸如boxedInteger
之类的对象类型
当然,使用阵列可能会带来一些内存和性能方面的好处,但这通常不会起到很大作用。数组
可以保存重复项,但列表也可以保存重复项。有关更多详细信息,请参阅
推理可以是任何东西,但它可能是有效的,例如,如果booksNames
作为数组存在于代码中的任何其他地方。为什么要在序列化之前将其转换为集
另一方面,如果它是-----这里是数组类型和集合类型,我会首先考虑事情——就像你提到的一样——可以有重复(如果你不知道询问人们接受/接受规范),并且重构代码只通过你决定使用的集合类型。使用集合(和流,而不是一直调用array.asList())更有趣
注意:对于后者-我应该添加IMHO-我指的是booksNames
来回转换的情况-从数组到集合再到数组。如果某个类/方法在其复杂的逻辑中使用数组,那么重写(或重写)就很容易了构造函数/方法,以接受集合类型而不是数组,并使其仅将集合类型转换为数组作为其第一个作业。JSON数组
可以在Java
中映射到:array
,Java.util.List
或Java.util.Set
。关于阵列:
值的有序列表。在大多数语言中,这是作为
数组、向量、列表或序列
最自然的方法是在Java
中将它映射到一个数组。它保持着秩序,直截了当。当您想要使用java.util.List
或java.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);
}
}
如图所示,您可以看到String[]
和java.util.ArrayList
显示了相同的结果,因为java.util.ArrayList
在幕后使用数组。使用设置时
输出不会保持顺序并删除重复项
在这种情况下,您需要验证请求并检查客户端是否发送了重复的请求。您不能使用默认的Set
mapping。另外,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]