外部枚举值列表
可以在不是简单静态值列表的属性上定义枚举约束。这些值来自某个外部源,并且可能会随着时间的推移而更改。“类型和属性管理”实用程序允许您在属性上定义静态枚举约束。这些枚举必须通过 UI 手动维护。但是,在某些情况下,您可能想要从外部源检索枚举,而不是手动维护静态列表。
范围/适用性/假设
此功能适用于在“类型和属性管理”实用程序中定义的字符串属性。
预期结果
利用此解决方案,您可以将属性约束为来自外部源的值的枚举列表。您可以控制以下内容:
值的本地化
值的排序顺序
值的可选择性
用于确保枚举始终保持最新的任何触发器条件
解决方案
实现 EnumerationInfoProvider 以提供枚举列表,并在“类型和属性管理”实用程序中配置约束,以使用您的 EnumerationInfoProvider
必备知识
要实现此目标,需要了解以下内容:
“类型和属性管理”实用程序中添加属性约束。
如何从外部源中提取必需的枚举值。
解决方案元素
元素
类型
说明
EnumerationInfoProvider
java
此接口用于定义实现自定义动态枚举提供者的方式。其实例通过反射进行实例化。因此,必需使用公用 no-arg 构造函数。此接口中的方法所抛出的任何异常都会导致空枚举。
EnumerationInfoManager
java
此接口用于定义枚举信息提供者可用于重置其缓存枚举的方法。
EnumerationInfo
java
此类表示枚举。它同时包含枚举特性及其条目。此类的线程不安全,将其传送到其他代码后不得再进行修改。
EnumerationEntryInfo
java
此类表示枚举条目。它包含枚举条目的特性。每个枚举条目都有唯一的名称。
过程 - 实现 EnumerationInfoProvider
提供 EnumerationInfoProvider 接口的实现。
在系统首次检索枚举之前,会调用一次 initialize 方法。参数字段的使用是可选的。如果您的实现不需要任何输入,则可以忽略该参数。参数字段的语法完全由您自行控制,唯一限制是不应包含空白区或 ‘~’ 字符。系统不会出于任何目的使用该参数。调用 EnumerationInfomanager.resetEnumeration(<provider>) 之后,也将调用 EnumerationInfoProvider.initialize() 方法。
getEnumerationInfo 方法将在初始化之后调用,并且该调用的结果将由系统自动缓存。只有在调用 EnumerationInfomanager.resetEnumeration(<provider>) 后进行下一个枚举请求时,才会调用 getEnumerationInfo 方法。否则,将返回缓存信息。您可以使用任何适合于您的使用情况的逻辑来确定何时调用 resetEnumeration。如果从未调用过此方法,则枚举实际上是静态的 (除非系统缓存因其他原因进行了刷新。)您可以定期或在对触发器作出响应时调用此方法。为了获得最佳性能,仅在对需要反映在枚举中的外部信息进行更改后才调用此方法。
getEnumerationInfo() 方法是返回 EnumerationInfo 数据结构实例的位置。EnumerationInfo 支持两种不可本地化的特性,您可以使用这些特性自定义枚举行为。
示例
public EnumerationInfo getEnumerationInfo() {
EnumerationInfo enumerationInfo = new EnumerationInfo();
enumerationInfo.setNonLocalizableProperty(EnumerationInfo.AUTO_SORT,
Boolean.TRUE);
enumerationInfo.setNonLocalizableProperty(EnumerationInfo.DEFAULT_LOCALE,
Locale.EN_US);

Set<EnumerationEntryInfo> enumEntryInfos = getEntries();
enumerationInfo.addEnumerationEntryInfos(enumEntryInfos);

return enumerationInfo;
}
EnumerationInfo 包含 EnumerationEntryInfo 数据结构的集合。EnumerationEntryInfo 数据结构支持两个不可本地化的和一个可本地化的特性,您可以使用这些特性自定义枚举行为。可本地化特性可以包含任何数量的不同区域设置的不同值集。
示例
Set<EnumerationEntryInfo> enumEntryInfos =
new LinkedHashSet<EnumerationEntryInfo>(12);
loop (…) {
String name = …;
EnumerationEntryInfo enumEntryInfo = new EnumerationEntryInfo(name);
int sortOrder = …;
Boolean selectable = …;
enumEntryInfo.setNonLocalizableProperty(EnumerationEntryInfo.SORT_ORDER,
sortOrder);
enumEntryInfo.setNonLocalizableProperty(EnumerationEntryInfo.SELECTABLE,
selectable);
Locale locale = …;
String displayName = …;
enumEntryInfo.setLocalizableProperty(EnumerationEntryInfo.DISPLAY_NAME,
locale, displayName); }
过程 - 在类型管理器和属性管理实用程序中配置外部枚举值列表约束
将外部枚举值列表约束添加到“类型和属性管理”实用程序中的属性时,必须指定两个字段。
指定 EnumerationInfoProvider 实现的完全限定 classname
或者,也可以指定应传递给 EnumerationInfoProvider 实现的 initialize 方法的参数字符串。
自定义点
自定义点 - EnumerationInfo
特性
默认值
可能的值
必需?
说明
EnumerationInfo.AUTO_SORT
Boolean.FALSE
Boolean.FALSE
Boolean.TRUE
如果 EnumerationInfo.AUTO_SORT 特性设置为 true,则系统会根据条目的本地化显示名称自动对枚举进行排序。如果其设置为 false,则系统会根据您分配给条目的相对排序顺序对枚举进行排序。如果针对两个或更多条目指定了相同的排序顺序,那么这些条目将根据其显示名称彼此相对地进行排序。未定义排序顺序的条目将在所有已定义排序顺序的条目之后按顺序排列。
EnumerationInfo.DEFAULT_LOCALE
系统区域设置
任何区域设置
no
用于指示当客户端请求枚举条目的某个区域设置的本地化显示信息而其本地化不可用时,应该用作回退的区域设置。
自定义点 - EnumerationEntryInfo
特性
默认值
可能的值
必需?
说明
EnumerationEntryInfo.SORT_ORDER
null
任意整数
no
如果 EnumerationInfo.AUTO_SORT 特性设置为 false,则系统会根据您分配给条目的相对排序顺序对枚举进行排序。如果针对两个或更多条目指定了相同的排序顺序,那么这些条目将根据其显示名称彼此相对地进行排序。未定义排序顺序的条目将在所有已定义排序顺序的条目之后按顺序排列。
EnumerationEntryInfo.SELECTABLE
Boolean.TRUE
Boolean.TRUE
Boolean.FALSE
no
指示最终用户在编辑操作过程中是否应可以选择该条目。
EnumerationEntryInfo.DISPLAY_NAME
null
任意字符串
指定区域设置的枚举条目的显示名称。
这对您有帮助吗?