gpt4 book ai didi

java - 将缺少的 xml 属性解码到可选的 java 对象

转载 作者:行者123 更新时间:2023-11-30 02:08:18 24 4
gpt4 key购买 nike

我正在尝试解码具有一些可选属性的 xml 文件(该属性可以包含在元素中,但有时会丢失)。如何从这些属性创建可选的 java 对象?

XML:

...
<example a="s"
b="2.0"
/>
<example a="z"
/>
...

Java:

@XmlRootElement(name = "example")
public class ExampleDTO {

private String a;
private Optional<Float> b;

public String getA() {
return a;
}

@XmlAttribute
public void setA(String a) {
this.a = a;
}

public Optional<Float> getB() {
return b;
}

@XmlAttribute
@XmlJavaTypeAdapter(FloatOptionalAdapter.class)
public void setB(Optional<Float> b) {
this.b= b;
}

适配器:

public class FloatOptionalAdapter extends XmlAdapter<Float, Optional<Float>> {

@Override
public Optional<Float> unmarshal(Float v) throws Exception {
return Optional.ofNullable(v);
}

@Override
public Float marshal(Optional<Float> v) throws Exception {
if (v == null || !v.isPresent()) {
return null;
} else {
return v.get();
}
}
}

当我运行此代码时,我得到了 2 个 ExampleDTO 对象。在第一个中,我得到值为“2.0”的可选对象。在第二个中,b 的值为“null”。如何使该值成为空的可选对象?

最佳答案

首先,永远不要离开Optional<T>字段处于 null 状态,因为它完全违背了使用 Optional<T> 的全部目的类型。

确保他们有 非空值,然后才允许 API 用户访问它并对其执行操作,例如private Optional<Float> b;声明为 private Optional<Float> b = Optional.empty() 会好得多(这实际上可能会解决您当前的问题)。

此外,我不喜欢使用Optional作为方法参数(see here)。

事实上,您的setB消耗 Optional<T>意味着任何人都可以将任何值分配给 b领域,这意味着人们甚至可以做到 setB(null) ,哎呀...

如前所述,理想情况下您应该避免使用可选参数作为参数,但如果您想保持原样,那么我建议执行一些验证以防止 null被传递到setB(...)方法再次违背了使用Optional的目的。

最后,使用默认值 bOptional.empty()以及预防null被传递到setB(...)方法,意思是b永远不可能null无论如何,为了利用Optional<T>,情况应该始终如此。类型。

关于java - 将缺少的 xml 属性解码到可选的 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50833239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com