使用 JAXB 创建不可变对象

2022-09-03 03:54:11

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

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

  • 谢谢

答案 1

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

来自 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;
    }

}

答案 2

您可以使用这些 XJC 编译器插件直接生成不可变类:


推荐