使用 JAXB 创建不可变对象
我正在使用JAXB从XSD文件创建Java对象。我正在创建不可变的包装器来隐藏 JAXB 生成的对象(之前我正在更新 JAXB 对象以实现不可变接口并将接口返回到客户端。但是意识到更改自动生成的类是不好的,因此使用包装器)
目前,我正在将这些不可变的包装器返回到客户端应用。是否有任何选项可以使自动生成的类是不可变的,并且可以避免创建不可变包装器的额外工作。鼓励采取任何其他办法。
- 谢谢
我正在使用JAXB从XSD文件创建Java对象。我正在创建不可变的包装器来隐藏 JAXB 生成的对象(之前我正在更新 JAXB 对象以实现不可变接口并将接口返回到客户端。但是意识到更改自动生成的类是不好的,因此使用包装器)
目前,我正在将这些不可变的包装器返回到客户端应用。是否有任何选项可以使自动生成的类是不可变的,并且可以避免创建不可变包装器的额外工作。鼓励采取任何其他办法。
从 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;
}
}
您可以使用这些 XJC 编译器插件直接生成不可变类: