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
之类的接口/类提供了这方面的示例内存消耗的差异可以忽略不计,您需要根据其他标准来决定。