java - 使用 JAXB 创建不可变对象(immutable对象)

标签 java jaxb pojo

我正在使用 JAXB 从 XSD 文件创建 Java 对象。我正在创建不可变包装器来隐藏 JAXB 生成的对象(之前我正在更新 JAXB 对象以实现不可变接口(interface)并将接口(interface)返回给客户端。但意识到更改自动生成的类是不好的,因此使用包装器)

目前我正在将这些不可变的包装器返回给客户端应用程序。是否有任何选项可以使自动生成的类不可变,并且可以避免创建不可变包装器的额外工作。鼓励任何其他方法。

  • 谢谢

最佳答案

从 JSR-133(Java 1.5 依赖项)开始,您可以使用反射来设置未初始化的最终变量。因此您可以在私有(private)构造函数中初始化为 null 并在没有任何 XMLAdapter 的情况下干净地使用 JAXB + immutable。

示例来自 https://test.kuali.org/svn/rice/sandbox/immutable-jaxb/ ,从 Blaise 的博客上的评论中得到这个 http://blog.bdoughan.com/2010/12/jaxb-and-immutable-objects.html#comment-form_584069422380571931

package blog.immutable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.NONE)
public final class Customer {

    @XmlAttribute
    private final String name;

    @XmlElement
    private final Address address;

    @SuppressWarnings("unused")
    private Customer() {
        this(null, null);
    }

    public Customer(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    public String getName() {
        return name;
    }

    public Address getAddress() {
        return address;
    }

}

关于java - 使用 JAXB 创建不可变对象(immutable对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11030805/

相关文章:

java - 为什么我无法使用 XMLType 从 CLOB XML 中将此值提取到 JDBC 查询中?

java - JAXB xsi :type subclass unmarshalling not working

jaxb - 解码单个元素列表失败

hibernate - JPA/HIBERNATE 处理非 POJO 实体

java - User (UserAccount) 和 Realm 的概念在 Apache Shiro 中如何关联?

java - 无法从字符串转换为(应该是另一个字符串)

java - 如何为 Spring 的 @PropertySource 注解传递命令行参数?

java - 尝试将 XML 映射到 POJO 时出现 "unexpected element"

sqlite - Android - GreenDao 为现有的 sqlite 数据库创建/使用实体和 Dao 类。将 greenDao 与现有数据库一起使用

java - 如何在 POJO 中持久保存大字符串?