局部变量对成员变量有何作用?

时间:2019-03-26 10:12:30

标签: java

当我看到诸如dubbo之类的框架源代码时,经常会看到类似于以下内容的代码:

public class Person {
   int age;
   String name;
   List<Person> persons = new ArrayList<Person>();

   public Person findPerson(int lowAge,int highAge){
         List<Person> localPersons = persons;
         for(Person p : localPersons){
              if( p.age >=lowAge && p.age <highAge){
                   return p;
              } 
         }
         return null;
   }

}

我只是不明白为什么不直接使用成员变量person。本地变量localPersons对我来说似乎很多余。

1 个答案:

答案 0 :(得分:5)

这可能是微优化,尽管我怀疑这与现代JVM会有什么不同。 (如果这是值得进行的优化,则JIT编译器的优化器可能会在本机代码级别进行等效的转换。)

如果有多个线程,也可能是(错误的)尝试使代码正常工作。我说“不正确”是因为程序员忽略了Java内存模型的要求。由于访问$db->query('set character_set_client=utf8mb4'); $db->query('set character_set_connection=utf8mb4'); $db->query('set character_set_results=utf8mb4'); $db->query('set character_set_server=utf8mb4'); 变量或其引用的列表的两个线程之间没有明确的发生关系,因此线程易于查看陈旧的数据,从而导致不可预测的行为。

还有可能这样做的其他原因在您的示例中并不明显。 (例如,如果将persons声明为persons,并且满足某些其他先决条件,则此可以是线程安全的,并且假定冗余的局部变量可以< / em>具有有效目的。)