2016-08-15 62 views
3

我看到很多SO帖子,说Java将任何未初始化的变量设置为null(如here,herehere ...)。我应该使用它们之前初始化我的变量为空?

但最近,我去当这个代码,谷歌here写:

cur = cr.query(builder.build(), INSTANCE_PROJECTION, selection, selectionArgs, null); 
while (cur.moveToNext()) { 
    String title = null; 
    long eventID = 0; 
    long beginVal = 0; 

    // Get the field values 
    eventID = cur.getLong(PROJECTION_ID_INDEX); 
    beginVal = cur.getLong(PROJECTION_BEGIN_INDEX); 
    title = cur.getString(PROJECTION_TITLE_INDEX); 

    // Do something with the values. 
    ... 
} 

我真的宁愿这样:

// Get the field values 
long eventID = cur.getLong(PROJECTION_ID_INDEX); 
long beginVal = cur.getLong(PROJECTION_BEGIN_INDEX); 
String title = cur.getString(PROJECTION_TITLE_INDEX); 

我认为谷歌developpers都弄好了真正合格的,所以我奇怪,因为我们处在同一个范围内:宣布第一种方式而非第二种方式有什么优缺点?

+1

我认为这是一个风格问题,以及您的编程风格应该如何基于公司标准(甚至是个人标准)。它们可能对他们更易读。但最终这个问题在我眼中是基于意见的。 – SomeJavaGuy

+3

这不是那些帖子说的。 Java只将未初始化的成员变量和静态变量设置为null。这不适用于局部变量。 – khelwood

+0

当我学会了在70年代编程时,我使用了Pascal,这是一种当时需要您将变量声明与其使用分开的语言。我仍然有时会看到当时的风格正在延续(尽管越来越少)。在像Java这样的现代编程语言中,无论我多么认同Google开发人员通常非常合格,我个人的口味显然是针对Google的版本。 –

回答

7

这是一个风格问题。我不为两个原因不必要的初始化:

  1. 这样做则会覆盖额外的检查Java编译器会给你,如果遇到未对所有的控制路径初始化变量编译不会成功。

  2. 它给人的印象是null是一个可以接受的值的参考,它往往不是。

+8

对于第三点,初始化为'null'或默认值不允许使这些变量成为'final' – JonK

+3

我同意你说为什么不建议初始化为null的原因,但我认为如果你声称“它是一个风格问题“你应该能够指出至少一个你可能想要初始化为null的原因。除了满足编译器无法静态推断的明确分配要求之外,我想不出一个好的理由;这不是风格问题,那是为了满足语言的要求。 –

+0

可能的第四点:这样做会隐藏未在一个可能路由中初始化变量的if/else块中的不完整初始化。在没有预先初始化的情况下,编译器会在这种情况下引发编译时错误 – Tom

相关问题