javac是否预先计算固定表达式?

javac是否预先计算固定表达式?,java,javac,Java,Javac,是否为此类变量声明提供了优化: final int secondsInDay = 24 * 60 * 60; 这个C++代码甚至编译不出来,尽管加号AsHelt < /C>完全不使用: #include <iostream> void additional_funct(int num); void main() { std::cout << "just a text"; } void additional_funct(int num) { //

是否为此类变量声明提供了优化:

final int secondsInDay = 24 * 60 * 60;
<>这个C++代码甚至编译不出来,尽管<代码>加号AsHelt < /C>完全不使用:

#include <iostream>

void additional_funct(int num);


void main()
{
    std::cout << "just a text";
}


void additional_funct(int num)
{
    // For both lines will be shown "divide by zero"
    int var = 5 / 0;
    int another_var = num + (2 / 0);
}
我知道
javac
并不编译C语言意义上的代码。但可能它以其他方式提供了优化,或者以这种方式声明此类数值文本更好:

// 24 * 60 * 60
final int secondsInDay = 86_400;

虽然
javac
没有进行任何主要的优化,但是这样的表达式可以在
javac
级别进行评估

如果反编译表达式
int secondsInDay=24*60*60您将得到如下结果

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=1, locals=2, args_size=1
     0: ldc           #2                  // int 86400
     2: istore_1
     3: return
  LineNumberTable:
    line 7: 0
    line 9: 3
#2
驻留在常量池中

Constant pool:
 ...
#2 = Integer            86400

如您所见,表达式的计算结果为其值
86400

是,
javac
将预计算编译时常量。它还将连接编译时常量字符串,例如,
final String s=“foo”+“bar”
将在字符串池中生成字符串
“foobar”
,而不是两个字符串
“foo”
“bar”

您应该始终编写代码以确保可读性。如果以
24*60*60
的形式编写更符合您的写作内容,请使用它。即使它不是在编译时计算的,我也会以极大的怀疑态度对待这种重复乘法对代码性能产生有意义影响的任何说法


调试您编写的
84_600
而不是
86_400
这一事实的成本要高出几个数量级。

其他答案都是正确的(最后是重复的),但有一个重要方面到目前为止没有提到

考虑不要这样做

当然,使用原语int来存储秒数可能是完全有效的。但是:取决于你的背景,以及事物的使用方式。。。在这里实际使用OO建模的功能可能是更好的设计。意思:如果你想表达时间的持续时间;那么为什么不使用对象和类来表示这些持续时间呢

我已经看到很多bug,人们在其中调用方法

someX.waitForGivenNumberOfSeconds()

只是因为他们做了复制+粘贴;忽略了他们是从一个使用毫秒的地方复制的;而不是几秒钟。即使方法命名说“给我几秒钟”;人们通过了“毫秒”。反之亦然。更糟糕的是:通常,唯一可见的指示可能是附加到要调用的方法的源代码的一些
@param durationInSeconds
。很容易出错。因此很容易在以后进行更改,并使所有现有代码陷入混乱


因此,长话短说:请退一步,确定“OO建模”开销是否适合您正在处理的“总体解决方案”。

看一看:
javap-cYourClass.class
。但是更为详细的方法是使用<代码> TimeStudio。天。ToSoNeDS(1)< /C>。C++代码将编译和运行(如果更改了代码的签名>主< /代码>),该代码仅给出。但确切地说,
secondsInDay
declaration:shumb to me=)我知道时间单位,但我甚至没有想过这样使用它。
someX.waitForGivenNumberOfSeconds()
someX.waitForGivenNumberOfSeconds(someValue * 1000)