Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 导入静态与静态最终_Java_Performance_Memory_Import_Constants - Fatal编程技术网

Java 导入静态与静态最终

Java 导入静态与静态最终,java,performance,memory,import,constants,Java,Performance,Memory,Import,Constants,在过去,我经常在Java类中使用“import static”构造。最近我意识到 import static my.pack.A.MY_CONSTANT; import static my.pack.PaymentType.CASH ... calculateSomething(amount, CASH); 你可以用 import my.pack.A; public class B { private static final MY_CONSTANT = A.MY_CONSTANT

在过去,我经常在Java类中使用“import static”构造。最近我意识到

import static my.pack.A.MY_CONSTANT;
import static my.pack.PaymentType.CASH
...
calculateSomething(amount, CASH);
你可以用

import my.pack.A;

public class B {
    private static final MY_CONSTANT = A.MY_CONSTANT;
}
这种方法最明显的优点是:

  • 您可以在Eclipse中使用重构来轻松地从代码中去除所有长常量表达式,如
    A.B.C.constant.other\u ONE.TOO\u long
    ,而不必干扰静态导入(在Eclipse中,静态导入不是很容易掌握)
  • 您可以为任何表达式指定任何名称,这在当前上下文中可能更有意义
  • 例如:

    private static final PAYMENT_TYPE = PaymentType.CASH;
    ...
    calculateSomething(amount, PAYMENT_TYPE);
    
    而不是

    import static my.pack.A.MY_CONSTANT;
    
    import static my.pack.PaymentType.CASH
    ...
    calculateSomething(amount, CASH);
    
    而且,如果默认PaymentType值更改为CREDIT_CARD,那么这也更容易重构

    我的问题是:与静态导入相比,这种方法是否有任何缺点,或者可以在任何地方使用


    现在我唯一关心的是生成的编译后的.class文件,这可能与所描述的两种方法不同。因此从理论上讲,性能和内存使用可能会受到影响。

    我认为唯一的缺点是,在将一个常量分配给另一个常量的情况下,您有更多的代码。除此之外,应该没有区别。性能和内存应该无关紧要,您可能会有更多的引用返回到相同的常量池条目。即使它创建了单独的常量池条目,也需要大量的常量池条目才能发挥作用


    在无法重命名原始条目的情况下,能够给常量起好名字可能是一件非常好的事情。

    这主要是一个品味问题,但官方建议谨慎使用
    静态版本,尤其是使用通配符。静态导入的主要缺点是,它将所有静态成员添加到名称空间中,从而污染了名称空间。在上面的示例中,应该是关于您认为代码更可读的内容。除非你真的想要
    的所有
    静态
    成员,否则不要急于去做“import package.*”


    它不应该影响编译后的代码——它只是提供了对同一常量的速记访问。

    您考虑过改用枚举吗?在这种情况下,它们似乎更合适。不确定枚举如何解决我将一些现有常量导入类文件的问题。实际上,枚举的值可以以任何一种方式导入,类似于常量。您是否能够编译这两个版本,反编译并比较差异?太抽象了。PaymentType看起来像接口常量反模式。枚举不需要静态导入,它们是隐式静态的。当我确定导入的常量在导入它的类的上下文中具有某种意义时,我倾向于进行静态导入。在IDE中,“导入静态my.pack.PaymentType.*”可以轻松自动地转换为“导入静态my.pack.PaymentType.CASH”。我甚至将此操作绑定到保存文件。这也是“static final”的一个优点,因为它在客户机类的上下文中具有更有意义的名称。