有没有一种标准方法可以确保您的自定义类是Initializable

时间:2014-01-22 08:36:36

标签: java initialization

我有一些POJO,我有一个案例,我以不知情的方式收到有关他们领域的信息。我的意思是我收到每个实例的Map,包含模式[field_name:field_value]中的一些对,我想用地图中的信息初始化实例。 所以我所做的是用单一方法

创建一个Initializable接口

public void initialize (Map initMap) throws Exception

然后我为我的POJO创建了一个超类来实现这个接口方法。这样我就可以确保我需要的每个类都可以从Map初始化。

我不太确定我能想到的模式是正确的模式,我觉得可以有一个标准的Java解决方案来应对这种微不足道的问题。那么有谁知道是否有一种标准的方法来做到这一点?

感谢您的回答!

编辑(答案):经过以下主题的一些讨论后,向我解释说我打算做的不是一个标准的案例,我不希望有一个标准的解决方案。我可以同意。另外,正如你所说,实现它并没有那么多努力。 我作为Java输入接收的内容可以描述为JSONObject。此JSONObject中的信息将用于创建我的实现模型所包含的特定类的特定java实例。出于这个原因,我正在使用反思。我正在实例化的类用大量字段描述,而我需要创建的实例的信息只包含一些字段。所以我的方法是创建实例,并使用该实例字段信息的Map来初始化具有所需信息的对象。

结论:我的问题不是标准问题。我将自己实现和管理Initializable抽象。

非常感谢所有发表意见的人!!!

2 个答案:

答案 0 :(得分:0)

如果Map包含字段名称与字段值,则可以使用反射

public void initialize (Map<String, Object> initMap) throws Exception {
        super.initialize(initMap);
        for(Field f : getClass().getDeclaredFields()) {
            Object value = initMap.get(f.getName());
            f.setAccessible(true);
            f.set(this, value);
        }
}

这个方法可以放在任何Pojo中,你可以使所有Pojo扩展IPojo

interface IPojo {
    public void initialize (Map<String, Object> initMap) throws Exception;
}

答案 1 :(得分:0)

您正在处理“字符串类型”数据(数据中的字符串必须与源中的某些名称匹配),但您可以使用反射来实现它:

public void initialize(Map<String, Object> initMap) throws Exception {
    for (Map.Entry<String, Object> entry : initMap.entrySet())
        getClass().getDeclaredField(entry.getKey()).set(this, entry.getValue());
}

注意:从拥有类中调用setAccessible(true)时,无需致电set();私有字段始终可供类本身访问。