使用初始化声明变量与直接使用值

时间:2015-07-27 02:03:35

标签: java

我有一个JAVA程序,它将EPOCH时间戳转换为Date,我们有两个建议的解决方案。一个只有3行代码,另一行大约10行。两者都产生正确的结果,操作次数相同,除了以下内容:

代码1:

 Date d = new Date;
 d = setTime(arg1*1000);

代码2:

 Date d = new Date;
 long timestamp = arg1 * 1000;
 d = setTime(timestamp);

这里有区别吗?效率可能吗?还是内存使用?我不完全确定Code 2是否使用了更多的内存,因为它声明了一个更多的变量'timestamp'。需要输入。谢谢!

4 个答案:

答案 0 :(得分:1)

如果timestamp变量没有在其他任何地方使用,那么两个aprroaches都是同样最优的。因为计算不是太大而不能使它不可读而且java只需要计算一次。

答案 1 :(得分:0)

没有显着的区别,只是你喜欢哪种风格。我通常会看到如果值被多次使用而使用的第二种样式,否则使用第一种样式。它归结为可读性以及以后更改代码的容易程度。

答案 2 :(得分:0)

JVM优化

评论和答案是正确的,无需担心这样的效率,因为JVM编译器和运行时非常擅长优化。保持代码简单为这种优化提供了最大的机会。换句话说,为智能JVM编写哑代码。

通常鼓励使用明智选择的名称创建中间变量:

  • 使您的代码更加自我记录。
  • 现代JVM善于高效handling and disposing of any such short-lived object。并且编译器可能已经优化了额外的变量并且内联了该值。
  • 最重要的是,调试更容易。跟踪完整代码时,您可以看到发生的每个增量更改/操作。命名变量用于在调试器工具中查看值的目录。

可读代码

因此专注于可读性,使您的代码易于人类理解。为此,我会:

  • 更改语句的顺序。通常在使用之前更好地准备数据,因此不要开始实例化Date对象,直到计算出毫秒数为止。
  • 利用java.util.Date constructor删除一行代码。
  • 将变量名称更改为自我记录。
  • 插入underscore in numeric literal以使数字更具可读性。
  • 将大写L附加到数字文字。虽然在这种特殊情况下追加可能在技术上不是必需的,因为编译器可以将int升级为longL会向读者强调我们正在努力创建{{1}而不是更常见的long

示例代码

int

java.time

更好的是完全避免使用旧的java.util.Date/.Calendar类,因为它们非常麻烦。在Java 8及更高版本中,这些类已被新的java.time包取代。

long millisecondsSinceEpoch = ( secondsSinceEpoch * 1_000L ) ;
Date date = new Date( millisecondsSinceEpoch ) ;

答案 3 :(得分:0)

我遵守规则。如果这段代码可以抛出异常,那么我把它放在自己的行上。我讨厌解决堆栈跟踪指向具有多个Java异常的潜在源的行的问题。在你的例子中,乘法不会抛出异常,因此根据我的规则,它可以与setTime()方法调用在同一行。