我想知道每次使用new编写以下代码以重新初始化对象以创建不同的对象值的缺点。
List <Value> valueList = new ArrayList<>;
Value value = new Value();
value.setData("1");
valueList.add(value);
value = new value();
value.setData("2");
valueList.add(value);
value = new value();
value.setData("3");
valueList.add(value);
或者可以添加一个方法来返回类似于以下内容的值对象:
private Value getData(String input){
Value value = new Value();
value.setData(input);
return value;
}
List <Value> valueList = new ArrayList<>;
valueList.add(getData("1"));
valueList.add(getData("2"));
valueList.add(getData("3"));
代码方面,第二种方法对我来说看起来更好。
请根据内存和性能建议最佳方法。
这两个选项都是创建 3 个对象并将它们添加到列表中。记忆没有区别。性能无关紧要。如果此代码的执行频率足以"重要",则 JIT 无论如何都会内联这些方法调用。如果 JIT 决定:不够重要,无法内联,那么无论如何我们都在谈论纳米秒。
因此:专注于编写干净的代码,以直接的方式完成工作。
从这个角度来看,我建议你宁愿有一个构造函数来获取这些数据;然后你可以写:
ValueList<Value> values = Arrays.asList(new Value("1"), new Value("2"), new Value("3"));
长话短说:性能是一个奢侈品问题。意思是:只有当你的测试/客户抱怨"事情花费太长时间"时,你才会担心性能。
在此之前,您担心创建一个好的、合理的 OO 设计并写下正确的实现。在构建良好的应用程序中修复某个性能问题要容易得多 - 与将"质量"放入由我们在您的问题中找到的想法驱动的代码库中相比。
请注意:这当然意味着您知道应该避免的典型"性能陷阱"。所以:一个有经验的Java程序员知道如何以有效的方式实现事物。
但是你作为一个新手:你只专注于编写正确的、人类可读的程序。请记住,您的 CPU 每秒执行数十亿个周期 - 因此默认情况下性能正常。只有当你做非常大规模的事情时,你才需要担心。
最后:选项 2 实际上"更好"——因为它减少了代码重复的数量。
在这两种情况下,您都会创建 3 个存储在列表中的Value
实例。
它在消耗的内存方面没有敏感差异。
最后一个仍然产生一个更干净的代码:你不重用同一个变量,并且变量的范围有限。
您确实有一个工厂方法可以完成工作并为您返回对象。
因此,客户端代码只需"消费"它。
另一种方法是带有 varargs 参数的方法:
private List<Value> getData(String... input){
// check not null before
List<Value> values = new ArrayList<>();
for (String s : input){
Value value = new Value();
value.setData(input);
}
return values;
}
List<Value> values = getData("1","2","3");
内存占用量没有区别,性能也几乎没有差异,因为方法调用非常便宜。
代码的第二种形式是第一种代码形式的更好看的版本,代码重复较少。除此之外,两者是等价的。
可以使用流缩短代码:
List<Value> = Arrays.asList("1", "2", "3").stream()
.map(Value::new)
.collect(Collectors.toList());
每次调用new运算符来创建对象时,它都会在堆上为该对象分配空间。使用第一种方法还是第二种方法都没关系,此对象以相同的方式分配给堆空间。
您需要了解的是您创建的每个对象的生命周期以及诸如依赖,聚合,关联和完整组合之类的术语。