哪个更好?
案例1:
set = new set<>();
if(flagEnabled) {
set = generateSet();
}
update(set);
案例2:
set; // no initialization
if(flagEnabled) {
set = generateSet();
} else {
set = new set();
}
update(set);
哪一个是可取的?
答案 0 :(得分:5)
选择第二种情况:在您的代码中有一条路径,其中创建的对象只是被丢弃并被另一个替换。
最好无条件地初始化您的对象:您可以通过使用三元运算符选择适当的选项来完成此操作,如下所示:
set s = flagEnabled ? generateSet() : new set();
条件逻辑仍然存在,但现在它与初始化相结合,使您的意图更容易看到。
答案 1 :(得分:3)
两个代码示例之间没有逻辑差异,但第一个示例可能涉及创建丢弃的新对象。要创建不必要的对象,您可以使用第二个示例,if
/ else
。
答案 2 :(得分:2)
第二部分在技术上会更好,因为它可以节省一些可能不必要的对象创建,从而有助于垃圾收集器。这与所谓的 Lazy Instantiation 有关,这意味着只有在需要时才会在内存中实例化对象。
但从逻辑上讲,这两者都是相同的。
以下是关于Lazy Instantiation
答案 3 :(得分:0)
您正在将变量初始化为Object
,在执行if-else语句后会立即将其丢弃。最佳做法是将其初始化为null
,尽管不是必需但是分配从未使用的对象是堆内存的纯粹浪费
答案 4 :(得分:0)
如果有人要使用此代码,或者如果您要在很长一段时间内维护此代码,最好保持简单并在将其创建为某个默认值时进行设置。
答案 5 :(得分:0)
我会考虑在generateSet()
方法中移动条件:
Set<T> generateSet() {
Set<T> theSet = new Set<>();
if(flagEnabled) {
// do stuff
}
return theSet;
}
然后你可以简单地做
mySet = generateSet();