java - 初始化枚举中的最终字段,其中的值是通过抛出异常的方法加载的?

标签 java enums initialization instance-variables

所以我尝试加载 Image 作为内部枚举中常量的一部分。类似于以下内容:

public enum State {
    HAPPY, SAD; 

    private final Image image;
}

目前,我从外部常量和静态初始化程序加载它,如下所示:

private static final Image HAPPY_IMAGE;
static {
    Image happyImage = null;
    try {
        happyImage = ImageIO.read(new File("path/to/file.gif"));
    }
    catch(IOException ioe) {
        LOGGER.fatal("Failed to load image.");
    }
    HAPPY_IMAGE = happyImage;
}

public enum State {
    HAPPY (HAPPY_IMAGE);

    private final Image image;

    private State(Image image) {
        this.image = image;
    }
}

不过,我不想使用这种方法,原因有两个。首先,它比看起来必要的要冗长一些。但更重要的是,它创建了一个冗余常数。当应该通过 State.HAPPY.getImage() 访问图像时,没有理由使用 HAPPY_IMAGE

以下内容有效,但我无法为每个枚举值分配不同的值。

public enum State {
    HAPPY;

    private final Image image;
    {
        Image image = null;
        try {
            image = ImageIO.read(new File("path/to/file.gif"));
        }
        catch(IOException ioe) {
            LOGGER.fatal("Failed to load image.");
        }
        this.image = image;
    }
}

那么有什么方法可以完成枚举的 final 值的加载吗?

最佳答案

枚举可以有构造函数。 所以你可以在那里进行加载。

public enum State {
  HAPPY("path/image.gif");

  private final Image image;     

  private State(String path)
  {
      this.image = ...
  }

  public Image getImage()
  {
      return image;
  }
}

关于java - 初始化枚举中的最终字段,其中的值是通过抛出异常的方法加载的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637498/

相关文章:

java - 如何使用 Gradle 从可执行 Jar 文件中创建可执行文件?

c++ - 将枚举作为参数传递给构造函数

Swift 语言 : nil check, 并且如果是则实例化新对象

java - 如何处理Java中的磁盘已满错误

java - 传递和返回没有 "new"关键字的类对象

c# - 如何将枚举值保存到 session

ios - Objective-C:我的初始值没有被设置

ios - iOS 5+ 中的 Objective-C 单例模式

java - 实现带有捏缩放功能的图库

android - 为什么 "Avoid Enums Where You Only Need Ints"从 Android 的性能提示中删除?