Java图标常量 - 静态常量是否正常?

时间:2008-12-15 18:55:17

标签: java icons constants

我在整个应用程序中使用了许多图标 - 让我们以ok / cancel图标为例。目前它们可能是一个勾号和一个十字架(tick.png,cross.png),但我可能希望将来更换它们。另外,我想将资源路径保存在一个地方。

这没关系:

public class Icons {
    public static Icon OK = new ImageIcon(Icons.class.getResource("/icons/tick.png");
    public static Icon CANCEL = new ImageIcon(Icons.class.getResource("/icons/cross.png");
}

或者我应该以不同的方式做这件事吗?我不介意在运行时依赖图像文件的存在,因为它们位于.jar

解决方案

我已经将Bent的想法用于初始化,并且我已经使常数最终:

public final class Icons {
    private static final Logger logger = Logger.getLogger(Icons.class);

    public static final Icon OK = icon("/icons/add.png");
    public static final Icon CANCEL = icon("/icons/cancel.png");

    private static Icon icon(String path) {
        URL resource = Icons.class.getResource(path);
        if(resource==null) {
            logger.error("Resource "+path+" does not exist");
            return new ImageIcon();
        }
        return new ImageIcon(resource);
    }
}

5 个答案:

答案 0 :(得分:3)

我看到两个问题,两者都可以接受:

  1. 如果找不到图标或由于某些原因无法加载,将很难调试。在静态初始化程序中运行的代码可能很棘手,因为它很容易“松散”异常。
  2. 该类可能永远不会被卸载,因此图标使用的资源永远不会被释放。
  3. 如果您可以确保图标始终存在,并且甚至可以通过将初始化放在静态初始化程序块中并添加良好的异常处理和日志记录来解决问题,那么数字1可能是可以接受的。

    数字2可能是可以接受的,因为图标通常在应用程序的整个运行时间内使用,并且在应用程序退出之前很久就不会释放它们。

    总而言之,我说那很好。

答案 1 :(得分:2)

您可能希望将常量标记为最终。

答案 2 :(得分:1)

如果你想把图标保存为静态常量,我会将ImageIcon对象的实例化提取为静态方法;

public static final Icon ok = icon("ok.png");


private static Icon icon(String path) {

    URL resource = Icons.class.getResource("/icons/" + path);
    if (resource == null) {
        // Log something...
        return null;
    }
    return new ImageIcon(resource);
}

通过这种方式,只要出现故障,您就可以控制,并且您不必在实例化中重复自己。

另外,我会让常数最终。

更通用的方法可能是使用反射来检查您的Icons类并为类中的每个公共静态Icon字段加载资源。这样,您只需要声明一个新的Icon常量,并根据常量的名称自动加载相应的资源。如果您需要更多提示,请发表评论。

答案 3 :(得分:0)

这似乎是一种相当简单的方法。虽然我会将图像命名为与它们的名称相同(“ok.png”,“cancel.png”)。并确保删除或重命名图像可能会导致问题。

答案 4 :(得分:0)

这似乎是做事的标准方式,但我以前遇到过问题。

如果您将Eclipse与Maven一起使用并将这些图标存储在maven的资源目录中,那么当Eclipse执行其中一个自动构建时,它不会将图标文件复制到target / classes目录。当它找不到图标时,这将导致运行时异常。

您必须至少手动执行一次maven包才能将图标放在正确的位置。