提供静态(默认)值的最佳方法

时间:2013-10-06 13:04:45

标签: java swing awt constants

提供程序可以作为默认值访问的静态(最终)值的最佳方法是什么?什么是最有效或最佳实践? 我正在使用普通的旧Java与AWT / Swing。

我可以设想编写一个只包含可以访问的公共常量的类Default。你会称之为'硬编码'吗?

另一个想法是在Android中的资源文件中提供值。但是我需要一种在编译时解析文件并为其生成类的机制。对于没有Android SDK的Java,是否存在这样的事情?

我对最佳实践和设计模式感兴趣。欢迎就我的问题提出任何建议。

2 个答案:

答案 0 :(得分:1)

  

我可以设想编写一个只包含可以访问的公共常量的类Default。你会称之为'硬编码'吗?

当然,这将是硬编码。另一方面,所有最后机会默认值都必须是硬编码的,所以这根本不是问题。

您还可以为可能使用的各种变量创建地图硬编码默认值,并在需要默认值时从该地图中读取。但是,这不会让编译器确保您引用的所有常量都存在,我认为这是首先为默认值创建类的重点。

我会接受你对Default类的建议,并使用静态导入它来获得漂亮可读的解决方案。

答案 1 :(得分:1)

通常,常量属于它们所属的类。例如:

public class Service {
    public static final int PORT = 8080;

    public static final int TIMEOUT = 10_000;

    public Service() {
        // ...
    }
}

public class AppWindow {
    public static final boolean CENTER_WINDOW = false;

    public static final int VISIBLE_LINES = 12;

    public AppWindow() {
        // ...
    }
}

如果您希望常量可配置,最简单的方法是将它们定义为系统属性:

public class Service {
    public static final int PORT = Math.max(1,
        Integer.getInteger("Service.port", 8080));

    public static final int TIMEOUT = Math.max(1,
        Integer.getInteger("Service.timeout", 10_000));
}

public class AppWindow {
    public static final boolean CENTER_WINDOW =
        Boolean.getBoolean("AppWindow.centerWindow");

    public static final int VISIBLE_LINES = Math.max(1,
        Integer.getInteger("AppWindow.visibleLines", 12));
}

如果要让用户能够在文件中配置这些默认值,只要在加载任何包含常量的类之前完成,就可以从属性文件中读取它们:

Path userConfigFile =
    Paths.get(System.getProperty("user.home"), "MyApp.properties");

if (Files.isReadable(userConfigFile)) {
    Properties userConfig = new Properties();
    try (InputStream stream =
            new BufferedInputStream(Files.newInputStream(userConfigFile))) {
        userConfig.load(stream);
    }

    Properties systemProperties = System.getProperties();
    systemProperties.putAll(userConfig);
    System.setProperties(systemProperties);
}

(为了简洁,我故意过度简化了属性文件的位置;每个操作系统都有关于此类文件位置的不同政策。)