何时创建引用、存储值和将引用设置为null

4

我有几个问题:

  1. Regarding the creation of References to Objects and primitive values, I was wondering: when is it usually appropriate to store values in a variable?

    From my general knowledge, the rule of thumb would be to create references when the same value is used more than once or to avoid hard-coding E.g.

    String name = "Bob"; 
    System.out.println("Welcome " + name + ". Is your name really " + name + "?");
    

    Whereas if it is only used once like in the example below, it would be more performant to simply do the following.

    System.out.println("Welcome Bob"); 
    

    as opposed to

    String name = "Bob"; 
    System.out.println("Welcome " + name + ".");
    

    Added question: If we are talking about a variable that is used when iterating over an array or enumerable object, which of the following would be more performant (assuming we are looping over an object like 1 million times)? Or would there be no difference and is simply a stylistic choice?

    For example,

    // nameArray is an extremely long array
    public static void loop(String[] nameArray) { 
        String name; //Should this be declared inside the loop? 
         int len = nameArray.length(); 
         for(int i = 0; i < len; i++) { 
             name = nameArray[i]; 
             System.out.println(name); 
         } 
    } 
    

    or would this be more preferred?

     // nameArray is an extremely long array
    public static void loop(String[] nameArray) { 
         int len = nameArray.length(); 
         for(int i = 0; i < len; i++) { 
             String name = nameArray[i]; //Declare String reference inside for loop
             System.out.println(name); 
         } 
    } 
    
  2. In regards to garbage collection, after a reference to an object/primitive has passed its useful life, is it always good practice to set that value to null to make it eligible for garbage collection (assuming that there are no other references to that object/primitive value) ?

    For example,

    String name = "Bob"; 
    System.out.println("Welcome " + name + ".);
    name = null;
    
感谢您抽出时间查看此内容。

当你编写代码时,真的不应该关心垃圾回收。 - Manu
如果name是一个局部变量,将其设置为null并不会有太大的影响,因为它的生命周期已经结束了。 - SomeJavaGuy
谢谢@Manu和Kevin的见解。现在一切都更有意义了。 - J. Lee
3个回答

4
  1. 无论您是否使用局部变量引用它,对象都会被分配。使用更易读的方式。

  2. 显式将值设置为null几乎永远不是一个好习惯。有一些极端情况,例如不这样做会保留对本来可以进行垃圾回收的变量的不必要引用(参见: Effective Java - Item 6: Eliminate obsolete object references)。在所有其他情况下,尽可能限制变量的作用域是帮助垃圾回收器最有效的方法。

底线是:只有在有充分理由时才不使用变量并让垃圾回收器完成其工作。


1
此外,要将变量保持在适当的范围内。 - chrylis -cautiouslyoptimistic-
非常感谢您的澄清。我添加了一个额外的问题(以粗体突出显示)。如果您有时间/可用,希望您能抽出时间来看一下它 :)。 - J. Lee
@J.Lee 你的两个例子可能会编译成相同的字节码,即使它们不同,也不会有任何性能差异。 - assylias
明白了。谢谢@assylias的见解。 - J. Lee

1

根据我所知,经验法则是当同一值使用超过一次或要避免硬编码时,请创建引用

请忘记这个规则。使用变量及其作用域可以帮助他人(和您自己)更轻松地理解您的程序。您可以像这样做

private static final String MY_UNCLE_NAME = "Bob"; 

System.out.println(String.format("Welcome %s.", MY_UNCLE_NAME));

更新

如果我们谈论的是在迭代数组或可枚举对象时使用的变量,以下哪种方式更加高效(假设我们要循环遍历一个对象100万次)?或者说它们没有区别,只是一种风格上的选择?

始终使用这种方式(尽可能减少变量作用域并忘记本地优化)。

// nameArray is an extremely long array
public static void loop(String[] nameArray) { 
     int len = nameArray.length(); 
     for(int i = 0; i < len; i++) { 
         String name = nameArray[i]; //Declare String reference inside for loop
         System.out.println(name); 
     } 
} 

明白了,我以后会更加注重代码的可读性和连贯性 :) - J. Lee
这很有道理。感谢您的回复! - J. Lee

1
  1. 什么时候通常适合将值存储在变量中?

大多数情况下,答案是:当代码从维护的角度受益时。如果代码变得更容易理解或调试,则使用变量。

  1. 在对象/基元的引用已经过其有用寿命之后,将该值设置为null以使其有资格进行垃圾回收总是一个好习惯吗?

如果变量很快就超出了范围,则将其设置为null只会不必要地使代码混乱。我只会将其用于长期存在的变量,也许还用于指向大型对象的变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接