0

这是我的方法:

public void addEmployee(Employee employee) {
if(! employees.containsKey(employee.getName())) {
      employees.put(employee.getName(), employee);
  }
}

如您所见,有一个访问employee.getName()器被多次调用。程序员应该为这样的多次调用创建一个单独的变量吗?像这样:

public void addEmployee(Employee employee) {
String name=employee.getName();
if(! employees.containsKey(name)) {
   employees.put(name,employee);
  }
}

从性能的角度来看,它是否有意义,而不仅仅是风格?

4

6 回答 6

3

从风格的角度(更清晰)和性能的角度(不做两次操作)来看,这都是有意义的。例如,getName可能需要对数据库进行查询,但您不希望执行其中两个!

于 2012-08-10T09:52:32.573 回答
2

从性能的角度来看,它是否有意义,而不仅仅是风格?

如果包含大量计算,则可以getName()

于 2012-08-10T09:52:55.723 回答
2

它当然不那么冗长。

性能可能是一个问题,但我不会为此过早地进行优化。getName()但是,您可能会争辩说,如果/何时重构以在将来执行更复杂的操作,则提前提取变量将使您避免潜在的性能问题。一个普通的 getter 不一定仍然是一个普通的 getter(这就是为什么我提倡对这些东西进行单元测试——即使是粗略的方式)

然而,另一个需要考虑的问题是不变性。可以employee.getName()更改,并且可以在上述运行时由另一个线程更改吗?如果可以,那么您的映射逻辑将中断。

于 2012-08-10T09:54:29.767 回答
1

从风格的角度来看,我更喜欢第一个选项,因为我不认为你应该引入局部变量,除非你要改变它们。

从性能的角度来看,我不确定会有很大的不同,我不知道 JIT 可以做什么。(在 C++ 中,getter 方法可以标记为 const,编译器可以轻松地进行优化)。

于 2012-08-10T09:58:00.590 回答
0

调用方法而不是读取变量会增加一点开销。如果性能是一个大问题并且每秒调用此方法很多次,它可能会有所作为。否则,这是一种风格偏好。

于 2012-08-10T09:55:24.170 回答
0

1.如果它只被调用一次,那么将它分配给另一个变量将是无用的。

2.如果它使用了不止一次并且处理 getName() 量很大,那么将它分配给一个变量以供以后使用,将是一个好主意,因为它会节省大量的处理时间。

于 2012-08-10T10:00:25.180 回答