我想知道是否有更简单的方法来进行简单检查 - 我希望能够检查任何对象,并查看是否至少设置了一个属性(不等于 null)。目前我可以使用反射来实现这一点,以获取所有字段并逐个检查,但这非常慢。还有另一种方法吗?
我能想到的唯一(有点怪异)的方法是创建一个新对象,其中所有属性都应初始化为null,并检查另一个对象是否等于它
任何帮助深表感谢!
我想知道是否有更简单的方法来进行简单检查 - 我希望能够检查任何对象,并查看是否至少设置了一个属性(不等于 null)。目前我可以使用反射来实现这一点,以获取所有字段并逐个检查,但这非常慢。还有另一种方法吗?
我能想到的唯一(有点怪异)的方法是创建一个新对象,其中所有属性都应初始化为null,并检查另一个对象是否等于它
任何帮助深表感谢!
你可以写一个接口NullCheckable
public interface NullCheckable {
boolean areAllPropertiesNull();
}
然后,您希望能够检查的每个类都使用适当的方法实现此接口,例如
public class Class1 implements NullCheckable {
private Object property1;
public Object getProperty1() {
return property1;
}
@Override
public boolean areAllPropertiesNull() {
return property1 == null;
}
}
假设您希望此检查在绝对任何对象上通用-无论您是否拥有它-我认为使用反射是实现此目的的唯一方法。
事实上,这种元编程检查正是反射所针对的类型。
仅当您可以保证所有对象的(非原始)实例变量将null
立即在构造之后(更新- 并且.equals()
被覆盖以比较每个字段)时,才能使用与新对象实例的比较,而您通常无法做到这一点案子。
例如,您要运行检查的类可以定义一个无参数构造函数来初始化一些实例变量,或者一些实例变量可以在声明时内联初始化。
Joe Elleson 方法的一个改进可能是提供一个抽象类
public abstract class NullChecker{
protected abstract Object[] getPropertiesToCheck();
protected boolean checkForNonNull(){
Object[] props=getPropertiesToCheck();
for(Object obj:props){
if(obj!=null){
return true;
}
}
}
然后扩展它并在每个类的方法实现中提供属性,例如
public Object[] getPropertiesToCheck(){
return new Object[]{property1,property2,property3};
}