Java - 在函数内创建具有常量值的字符串

Adi*_*Adi 3 java string memory-management

哪一个更好?

public class A {
      private static final String DOSOMETHING_METRICS = "doSomethingmetrics";
      private static final String SAYSOMETHING_METRICS = "saySomethingmetrics";
      public void doSomething() {
            ...
            System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
      }
      public void saySomething() {
            ...
            System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
      }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class A {
      public void doSomething() {
            final String DOSOMETHING_METRICS = "doSomethingmetrics";
            ...
            System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
      }
      public void saySomething() {
            final String SAYSOMETHING_METRICS = "saySomethingmetrics";
            ...
            System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
      }
}
Run Code Online (Sandbox Code Playgroud)

我认为方法1在内存优化的情况下获胜,因为编译器只分配了一次内存,垃圾收集器不需要释放在每个函数调用中创建的字符串.但是,我认为良好的编码实践建议变量应该绑定到必须使用的范围,并且常量应该定义为它们在方法2获胜的程序中首次使用时的常量.

你对此有什么看法?哪个方面更重要?这里的函数将被多次调用(比如说至少100K次).

Jon*_*eet 6

在这两种情况下,这些都是JLS 4.12.4中定义的常量变量.因此,不仅字符串"doSomethingmetrics"和"saySomethingmetrics"被实现了,而且"doSomethingmetrics的度量标准是某种东西"和"Saysomethingmetrics的度量标准"也是如此.(是的,你需要在"是"之前添加一个空格.)

第一个版本在逻辑上有一个稍小的堆栈,但我希望JIT无论如何都要优化它.

我会使用你认为最具可读性的形式.如果您想确切知道特定应用程序的性能,那么正如以往一样,正确的做法是测试两种方式.

看看结果javap -v,看起来第二种方法实际上有一点点优势,即非连接的字符串甚至不需要出现在常量池中,因为没有办法到达它们.所以你应该看到你的类文件在这方面变得越来越小.但同样,我非常怀疑这会有什么不同.