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

时间:2014-10-29 17:58:31

标签: 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;
    }
}

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

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

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值的加载?

1 个答案:

答案 0 :(得分:4)

枚举可以有一个构造函数。 所以你可以在那里装货。

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

  private final Image image;     

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

  public Image getImage()
  {
      return image;
  }
}