Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Memory Management - Fatal编程技术网

Java 单例、静态或接口作为常量字段?

Java 单例、静态或接口作为常量字段?,java,memory-management,Java,Memory Management,我需要final字段作为我的应用程序配置常量 我知道3种不同的方法,但我不知道哪一种是最好的,在这种情况下JVM的行为是什么(从内存管理和内存问题的角度来看) 1。使用静态字段 public class Constants { public static final String URL = "https://www.google.com"; } //usage Constants.URL public interface Constants { String URL = "h

我需要
final
字段作为我的应用程序配置
常量

我知道3种不同的方法,但我不知道哪一种是最好的,在这种情况下JVM的行为是什么(从内存管理和内存问题的角度来看)

1。使用静态字段

public class Constants {
    public static final String URL = "https://www.google.com";
}
//usage
Constants.URL
public interface Constants {
    String URL = "https://www.google.com";
}
//usage
Constants.URL
2。使用接口

public class Constants {
    public static final String URL = "https://www.google.com";
}
//usage
Constants.URL
public interface Constants {
    String URL = "https://www.google.com";
}
//usage
Constants.URL
3。使用单例设计模式(非静态)

public class Constants {
    public final String URL = "https://www.google.com";
}
//usage
public static Constants instance = new Constants();
Constants.instance.URL;

它们都不是,请使用和枚举类型。请记住,第二个选项确实不可取,因为接口最重要的一点是您正在定义一个新类型

顺便说一句,枚举是单例的(您可以这样使用它们),默认情况下确实是线程安全的

例如:

public enum ApplicationStatus {
    LIVE("live"),
    MOCKS("mocks");

    private final String status;

    ApplicationStatus(final String status) {
        this.status = status;
    }

    public String value() { return status; }
}

这应该适用于整个应用程序的真正全局消息/常量/etc。

为什么枚举更好?为什么“定义新类型”只适用于接口?类和枚举声明还引入了新的类型…枚举的另一个优点是您可以通过定义方法向其添加一些行为。这是非常灵活和强大的。@meriton类和枚举最终引入了新类型,但我明确地说:最重要的一点是@uıɥɔɐɯ谢谢你,你能写一下JVM如何将内存分配给signalton、interface和enum字段吗,例如,在单例设计模式中,当我们有一个类的静态实例时,具有字段的JVM行为是否与静态字段相同(我的问题中的方法1和3)?建议这样做的方法是将直接应用于类/接口的常量包含在该类/接口定义中。诸如
Calendar
gridbagstraints
之类的接口/类提供了这方面的示例内存消耗的差异可以忽略不计,您需要根据其他标准来决定。