2016-02-26 59 views
1

在声明上实例化收集字段是否是一种好的做法?例如:我应该在声明上实例化收集字段吗?

class A { 
    private List<String> list = new ArrayList<>(); 

    public List<String> getList() { 
     return list; 
    } 

    public setList(List<String> list) { 
     this.list = list; 
    } 
} 

为什么我需要它是避免检查空这样的理由:

if (a.getList() != null) 

回答

4

这是更好地避免有null值在可能的情况。您也可以将该字段设为final,以便您知道它永远不会是null有注释可以让您跟踪值不能为空。

private final List<String> list = new ArrayList<>(); 

@NotNull 
public List<String> getList() { 
    return list; 
} 

如果你这样做以后

if (a.getList() != null) // your IDE can tell you this is always true. 
1

意见不尽相同,但在这种情况下,我肯定会认为:空集是远远超过可空更清晰,更纯净的空能集合。

正开始出现也意味着你可以做赋予一些利益领域final,但在这里你必须让你的setList()改为调用clear()addAll()的新项目。因此,也许没有多少益处单独在这里,但在其他情况下,它的优点...

0

我认为一个更好的地方开始你的对象是类的构造
一个全面的解释:Should I instantiate instance variables on declaration or in the constructor?

Instantiating object in a constructor

+1

小心阐述为什么这会更好? – Nfear

+0

@Nfear请参考此回答[在构造函数中实例化对象](http://stackoverflow.com/a/9282784/2119902) – Ehsan

+1

我明白了。因此,对于不使用数组列表的情况。可以避免初始化以节省内存。 – Nfear

0

有了你显示,setList()可以设置null值,所以不能删除null检查的特定代码。不过,我会建议你改变设置1)拒绝空值,或2)设置Collections.emptyList()而不是null,或3)设置新的ArrayListLinkedList而不是null。 空值始终是一个需要处理的痛苦,对于集合来说这更糟糕。许多最佳实践建议禁止空集合。我完全同意。

更改此类行为意味着您需要查看getList()的所有呼叫站点,并检查此类更改是否会破坏它。如果确实如此,那么您需要更改解决方案或修改客户端代码。

相关问题