Java:最好的方法是在不消耗内存的情况下始终需要一长串变量?

evi*_*iko 3 java memory-management

我写了一个抽象类来包含应用程序的所有规则,因为我几乎在我的应用程序的所有地方都需要它们.所以它包含的大部分内容都是static final变量,如下所示:

public abstract class appRules
{
    public static final boolean IS_DEV = true;
    public static final String CLOCK_SHORT_TIME_FORMAT = "something";
    public static final String CLOCK_SHORT_DATE_FORMAT = "something else";
    public static final String CLOCK_FULL_FORMAT = "other thing";
    public static final int USERNAME_MIN = 5;
    public static final int USERNAME_MAX = 16;
    // etc.
}
Run Code Online (Sandbox Code Playgroud)

这个类很大,包含很多这样的变量.

我的问题:

  • 是不是设置静态变量意味着这些变量一直浮在内存中
  • 你是否建议使用一个抽象类,我有一个带有非静态变量的实例化类(只是public final),所以我实例化该类并在我需要它时才使用它们.
  • 或者我正在做什么是完全错误的方法,你建议别的什么?

Sea*_*oyd 7

鉴于现代机器,RAM容量等,您必须拥有数千条规则(如果不是数百万条)才能在性能和内存方面做出明显的差异.

所以问题不在于是否会占用你的系统:事实并非如此.

问题是这是否是一个好习惯.

我当然自己使用这种模式,所以我理解它的用处.但主要的缺点是:它使你的代码不可测试.由于没有简单的方法来为单元测试设置不同的值(与在类路径中放置不同文件的属性文件相反),如果不连接整个应用程序,将很难测试单个模块的功能,但这取决于你在这些常数中保留的内容.

我想也许我会尝试拆分,每个模块有一个常量类,包等,并从属性文件初始化这些常量:

private static final String CONSTANT_FOO;
private static final String CONSTANT_BAR;
static{
    try{
        Properties props = new Properties();
        InputStream is = 
            MyConstantClass.class
            .getResourceAsStream("my.module.properties");
        props.load(is);

        // you'll actually want to move this to finally, but I'm lazy
        is.close();

        CONSTANT_FOO = props.get("constants.foo");
        CONSTANT_BAR = props.get("constants.bar");

    }catch(Exception e){
        throw new IllegalStateException(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的代码可以更加可测试和配置,同时仍然享受全局配置常量的好处.