我遵循Java工厂模式为我正在创建的报告定义不同的PDF模板。
Template
TemplateFactory
Example1Template
Example2Template
在具体类Example1Template和Example2Template中,我需要有一个包含在PDF模板中的页面集合,这些页面对于每个实现都是不同的。目前我有一个值为的HashMap:
private static final Map<String,Integer> PAGES;
static
{
PAGES = new HashMap<>();
PAGES.put("COVER", 1);
PAGES.put("DEFAULT", 2);
PAGES.put("PAGE_TYPE_1", 3);
PAGES.put("PAGE_TYPE_2", 4);
PAGES.put("PAGE_TYPE_3", 5);
}
理想情况下,我喜欢使用类似枚举的东西,我可以从类型安全和有限的输入中受益,而不仅仅是使用字符串键,但我努力让它发挥作用。
编辑: 在Factory模式的上下文中实现这一目标的最佳方法是什么?
Template template = TemplateFactory.get(TemplateType.CORPORATE);
然后我可以更改我的代码以使用我正在使用的template.PAGES.COVER&#34; COVER&#34;使用HashMap指定页面。这是我无法使用Factory模式的部分。
答案 0 :(得分:0)
Java枚举最终......只是特殊版本的类。这意味着您可以使用自定义构造函数,例如:
public enum Whatever {
Bar(1), Foo(2);
private final int whoCares;
private Whatever(int value) { whoCares = value; }
public int getValue() { return whoCares; }
当然,有趣的部分可能是......迟早你需要多个这样的枚举 - 所有枚举都带有相同的枚举实例名称,但提供对不同属性的访问。
答案 1 :(得分:0)
使用有价值的枚举(该值在私有构造函数中设置,因此无法更改):
public enum Pages {
COVER(1),
DEFAULT(2);
private final int value;
Pages(int value) { this.value = value; }
public int getValue() { return value; }
}
答案 2 :(得分:0)
以下是使用Enum实现使用Map与实现的实现的快速演示:
public class TestEnum {
public enum PAGES {
COVER(1),
DEFAULT(2),
PAGE_TYPE_1(3),
PAGE_TYPE_2(4),
PAGE_TYPE_3(5);
public final int value;
PAGES(int value) {
this.value = value;
}
}
private static final Map<String,Integer> pages;
static
{
pages = new HashMap<>();
pages.put("COVER", 1);
pages.put("DEFAULT", 2);
pages.put("PAGE_TYPE_1", 3);
pages.put("PAGE_TYPE_2", 4);
pages.put("PAGE_TYPE_3", 5);
}
public static void main(String[] args) {
for ( PAGES page : PAGES.values()) {
System.out.println("Enum value is "+ page.value + " Map vlaue is "+ pages.get(page.name()));
}
}
}
打印输出为:
枚举值为1地图值为1
枚举值为2地图值为2
枚举值为3地图值为3
枚举值为4地图值为4
枚举值为5地图值为5