【问题标题】:Java icon constants - Are static constants ok?Java 图标常量 - 静态常量可以吗?
【发布时间】:2008-12-15 18:55:16
【问题描述】:

我在整个应用程序中使用了许多图标 - 让我们以确定/取消图标为例。目前它们可能是一个勾号和一个十字(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 的想法进行初始化,并且我已经将常量设为 final:

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);
    }
}

【问题讨论】:

  • OK 和 CANCEL 的类型应该是 Icon 而不是 ImageIcon。无需将 ImageIcon 作为其公共合同的一部分公开。
  • 好点 - 这就是我快速输入示例的结果!固定

标签: java icons constants


【解决方案1】:

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

  1. 如果您的图标找不到或由于某些原因无法加载,将很难调试。在静态初始化程序中运行的代码可能很棘手,因为很容易“释放”异常。
  2. 类可能永远不会被卸载,因此图标使用的资源永远不会被释放。

如果您可以确保图标始终存在并且甚至可以通过将初始化放在静态初始化程序块中并添加良好的异常处理和日志记录来解决,数字 1 可能是可以接受的。

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

总而言之,我认为这很好。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您想将图标保留为静态常量,我会将 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);
      }
      

      这样,无论何时发生故障,您都可以进行控制,并且您不必在实例化中重复自己。

      另外,我会将常量设为 final。

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

      【讨论】:

      • 我喜欢这个,虽然 a) 它可能应该返回 Icon 而不是 ImageIcon,b) 返回一个空图标而不是 null 可能会更好。
      • 反思?呸。枚举会更好。如果我们有“抽象枚举”会很有用。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 我不使用(或喜欢)Eclipse 或 Maven,所以这不是问题。无论如何,这是一个工具问题,所以如果我遇到这样的事情,我会倾向于修复该工具。不过有用的提示。
        猜你喜欢
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2011-01-14
        • 2014-07-02
        • 1970-01-01
        • 2015-12-10
        相关资源
        最近更新 更多