2014-09-26 74 views
0

哪个更好?编程最佳实践:初始化或不初始化

情况1:

set = new set<>(); 

if(flagEnabled) { 
    set = generateSet(); 
} 

update(set); 

情况2:

哪一个是可取?

+1

我要说不分配你不使用计划内存。你只是在浪费垃圾收集器的时间。 – 2014-09-26 20:39:49

+2

'set = flagEnabled? generateSet():new set()'? – 2014-09-26 20:41:18

+1

'generateSet()'做什么?你可以移动函数调用中的'if'语句,只需执行'set = generateSet()'? – 2014-09-26 20:41:26

回答

3

这两个代码示例之间没有逻辑差异,但第一个示例可能涉及创建一个丢弃的新对象。为了不创建不必要的对象,可以使用第二个示例,并使用if/else

0

要初始化的变量的Object其中的if-else statement.The最好的做法是将其初始化为null执行后得到及时报废,尽管它不是必需的,但分配一个对象,它是从来没有使用过的纯堆内存浪费

+0

但是如果有一个代码路径不使用变量,为什么declare该范围内的变量呢? – 2014-09-26 20:44:13

2

第二部分在技术上会更好,因为它可以节省一些可能不必要的对象创建,从而帮助垃圾收集器。这与懒惰实例化有关,这意味着只有在我们需要它们时才在内存中实例化对象。

然而,从逻辑上讲,这两者是相同的。

这里是读好有关Lazy Instantiation

0

是否有人曾将要使用此代码,或者如果你将要维护该代码在相当长的时间周期,这将是更好地保持它的简单并在您将其创建为某个默认值时进行设置。

+0

“取决于你所处的语言”这个问题显然标记为Java。 – 2014-09-26 20:44:04

+0

我现在看到标签,正在看遍各地,除了我需要的权利! – 2014-09-26 20:45:17

5

选择第二种情况:在您的代码中存在一个路径,其中创建的对象只能丢弃并替换为另一个。

最好是无条件地初始化的对象,但:您可以通过选择相应的选项与三元运算符,这样做:

set s = flagEnabled ? generateSet() : new set(); 

条件逻辑保持在原位,但现在是结合初始化,使您的意图更容易看到。

0

我会考虑移动generateSet()方法中的条件:

Set<T> generateSet() { 
    Set<T> theSet = new Set<>(); 

    if(flagEnabled) { 
     // do stuff 
    } 

    return theSet; 
} 

然后,你可以简单地做

mySet = generateSet();