gpt4 book ai didi

java - 使用 org.apache.commons.ObjectUtil 类对自定义对象进行空安全检查

转载 作者:行者123 更新时间:2023-12-01 19:16:26 24 4
gpt4 key购买 nike

我一直在寻找一种强大的方法来比较我的对象,我遇到了 ObjectUtils ,并且立即怀疑它是否能够有效地比较它,因为我不知道它的内部工作原理和 apache 上的文档关于此的组织网站很少。

有人可以帮我解决这个问题吗?

编辑:

当我说比较时,我真正需要比较的是 MYOBJ 的相等性,其中 MYOBJ 是我定义的自定义对象,其中包含各种变量(所有这些变量都是原始数据类型,如 int、long、float如果字符串不为空,则可以直接进行比较),但这在将来可能会改变。

我不确定 BeanUtils.areEqual 方法是否能够处理这种情况,以及如果我在这个 MYOBJ 中包含我自己的数据类型(非基元)会怎样。

谢谢

最佳答案

你的问题很模糊,我真的不知道你在说什么,所以我会分几个方向。

“比较我的对象”可能有多种含义。在 Java 中,这通常意味着比较它们以进行排序,即通过 Comparable/Comparator 接口(interface)。虽然 ObjectUtils 可以实现 provide a null-safe compare method ,但除此之外它不会为您提供帮助。您需要的是自定义 Comparator 或让您的对象实现 ComparableCompareToBuilder 在一定程度上可以帮助您解决这两个问题:

public class SomeBean implements Comparable<SomeBean>{

private String foo;
private int bar;
private List<String> baz;

public int compareTo(SomeBean other) {
return new CompareToBuilder()
.append(foo, other.foo)
.append(bar, other.bar)
.append(baz, other.baz)
.toComparison();
}

}

另一方面,如果您想比较不同对象类型的属性,那么您就找错了方向。看看 Commons / BeanUtils 吧。示例代码:

public class BeanUtilsTester {

public static class Foo{
private String foo="foo";
public String getFoo() {return foo;}
public void setFoo(String foo) {this.foo = foo;}
private Integer bar=123;
public Integer getBar() {return bar;}
public void setBar(Integer bar) {this.bar = bar;}
private List<String> squoggle=Arrays.asList("abc","def");
public List<String> getSquoggle() {return squoggle;}
public void setSquoggle(List<String> squoggle) {this.squoggle = squoggle;}
}

public static class Bar{
private String foo="bar";
public String getFoo() {return foo;}
public void setFoo(String foo) {this.foo = foo;}
private Integer bar=456;
public Integer getBar() {return bar;}
public void setBar(Integer bar) {this.bar = bar;}
private String[] fiddle=new String[]{"abc","def"};
public String[] getFiddle() {return fiddle;}
public void setFiddle(String[] fiddle) {this.fiddle = fiddle;}
}

public static void main(String[] args) throws Exception{
Foo foo = new Foo();
Bar bar = new Bar();
Map<String,Object> fooProps = BeanUtils.describe(foo);
Map<String,Object> barProps = BeanUtils.describe(bar);
fooProps.keySet().retainAll(barProps.keySet());
BeanUtils.populate(bar, fooProps);
assertEquals(foo.getFoo(),bar.getFoo());
assertEquals(foo.getBar(), bar.getBar());
}

}

如果您只想正确实现 equals(),请查看 EqualsBuilder :

@Override
public boolean equals(Object obj) {
if (obj instanceof SomeBean) {
SomeBean other = (SomeBean) obj;
return new EqualsBuilder()
.append(foo, other.foo)
.append(bar, other.bar)
.append(baz, other.baz)
.isEquals();
}
return false;
}

关于java - 使用 org.apache.commons.ObjectUtil 类对自定义对象进行空安全检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466603/

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