首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有什么标准或简单的方法来冻结JavaBean吗?

有什么标准或简单的方法来冻结JavaBean吗?
EN

Stack Overflow用户
提问于 2012-10-19 16:31:15
回答 2查看 337关注 0票数 5

我发现自己陷入了使用大量JavaBeans的不幸境地。我说“不幸”是因为我不喜欢它们是可变的。因此,在我创建bean之后(我使用Jackson从JSON中转换它们),我想在指定的时刻“冻结”bean,以确保它们不会在行中发生变异。

我不具备编写每个bean的可变/不变版本的能力,也不具备定制Jackson工厂的能力,因此我正在寻找一个库或函数调用,它与Collections.unmodifiableCollection(...);非常类似,但对于bean则是如此。

(是的,我知道如果原来的豆子被泄露,那并不是真正的冻结。)但我会在创建后立即将其包装或冻结,不再使用原版。)

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-19 17:16:57

您是基于bean接口还是基于pojos?如果它们是基于接口的,那么只需编写一个实用程序方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ImmutableBean {
    public static <T> T makeImmutable(T t) { ... }
}

然后,您可以创建一个特定于您的bean的java.lang.Proxy实例,或者查找以"set“开头的方法等模式,并抛出一些特定的异常。下面是一个关于创建代理实例的好的简短教程:http://www.javalobby.org/java/forums/t18631.html

如果它们是pojo的,那么您应该能够使用像javassist或cglib这样的库来创建一个增强版本,在这个版本中,您的setter会被存根以引发异常。

下面是一个javassist示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public static <T> T makeImmutable(final T t) throws NotFoundException, InstantiationException, IllegalAccessException {
    MethodHandler mh = new MethodHandler() {
        @Override
        public Object invoke(java.lang.Object self, java.lang.reflect.Method thisMethod, java.lang.reflect.Method proceed, java.lang.Object[] args) throws Throwable {
            if (thisMethod.getName().startsWith("set")) {
                throw new UnsupportedOperationException();
            }
            return proceed.invoke(t, args);
        }

    };

    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.setSuperclass(t.getClass());
    Class<T> clazz = (Class<T>) proxyFactory.createClass();
    T instance = clazz.newInstance();
    ((ProxyObject)instance).setHandler(mh);

    return instance;

}

但是,这将要求原始类有一个no-arg构造函数,因此如果没有no arg构造函数,则可能必须为类执行特定的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-10-19 16:58:26

当我搜索"java不可变“时,Google发现了这一点:

409.html

我不知道它是否行得通,但这篇文章声称它能做到。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12984173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文