java - 如何在java中触发静态代码的执行?
问题描述
我正在尝试构建的是具有更高级 valueOf 方法的枚举类列表。由于该方法不能被覆盖并因此被扩展,我想创建一个类来保存所有具有高级ValueOf 方法的枚举并由 lambda 运行它。我面临的问题是枚举的注册是在静态代码中,这是在第一次检查枚举之后触发的。
public enum SimpleEnum
{
ONE,
TWO;
static
{
EnumTest.registerEnum(SimpleEnum.class, SimpleEnum::advancedValueOf);
}
public static SimpleEnum advancedValueOf(String s)
{
return ONE;//This method would find enum by its parameters
}
}
//------------------------------------------------
public class EnumTest
{
private static final Map<Class<?>, Function<String, ?>> _advancedValueOfEnums = new HashMap<>();
public static void main(String[] args)
{
getValue(SimpleEnum.class, "1");
}
public static <T extends Enum<T>> void registerEnum(Class<T> enumClass, Function<String, T> advancedValueOf)
{
_advancedValueOfEnums.put(enumClass, advancedValueOf);
}
public static void getValue(Class<?> enumClass, String value)
{
System.out.println("Contains=" + _advancedValueOfEnums.containsKey(enumClass));
}
}
打印到控制台的消息是“Contains=false”。我该怎么做才能使它“包含=真”?
这个答案:为什么枚举的构造函数不能访问静态字段?显示从枚举构造函数访问静态字段有什么问题,我问的是从应该已经初始化的不同类访问枚举的静态值。
解决方案
您可以通过对枚举执行任何调用来加载枚举类,例如Enum.values()
:
public static void main(String[] args){
SimpleEnum.values(); // hack to load the enumeration class
getValue(SimpleEnum.class, "1");
}
但这是一个 hack:不可读且容易被更改破坏,因为这是两个不同的类。
我认为EnumTest
和之间的分离SimpleEnum
太人为了,而且它们的有效耦合度太高:SimpleEnum
取决于EnumTest
,本身取决于SimpleEnum
。
要么使用单个类:仅使用枚举类,要么保留两个类,但要真正区分它们的职责。
推荐阅读
- extjs - ExtJS 中基于 store 的卡片列表
- java - 从键盘事件中捕获日文字母
- java - 运行时的动态表达式求值器
- python - 使用 Affinity Propagation 对相似文本进行聚类并创建聚类图
- java - 在分布式应用程序中锁定表行,在 mysql 5.6 中运行 select..for update 时整个表被锁定
- reactjs - 从下拉列表中选择一个项目并在 React ES6 的另一个组件中使用该值
- c# - 映射到不同的类文件助手很慢
- php - PHP PDO 将字符串转换为 MS SQL datetime2
- php - 错误的ajax响应
- php - Woocommerce:当购物车中已有商品时,更改“添加到购物车”按钮颜色