这意味着该类已初始化,但未设置变量。
示例类:
public class User {
String id = null;
String name = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
实际的类很大,我不想检查每个变量是否(xyz == null)。
答案 0 :(得分:36)
另一个针对Java 8的非反射解决方案,在paxdiabo's answer行中,但没有使用一系列if
,将流式传输所有字段并检查是否为空:< / p>
return Stream.of(id, name)
.allMatch(Objects::isNull);
这仍然很容易维护,同时避免反射锤。
答案 1 :(得分:27)
尝试这样的事情:
public boolean checkNull() throws IllegalAccessException {
for (Field f : getClass().getDeclaredFields())
if (f.get(this) != null)
return false;
return true;
}
虽然如果可行的话,检查每个变量可能会更好。
答案 2 :(得分:5)
“最佳”是这样一个主观术语: - )
我只想使用检查每个变量的方法。如果你的课程中已经有很多这些,那么如果你做了类似的事情,那么增加的大小就不会那么多了:
public Boolean anyUnset() {
if ( id == null) return true;
if (name == null) return true;
return false;
}
如果您按照相同的顺序保存所有内容,则代码更改(如果您是偏执狂,则使用脚本自动检查)将相对轻松。
或者(假设它们都是字符串),您基本上可以将这些值放入某种类型的映射中(例如,HashMap
),并保留该列表的键名列表。这样,您可以遍历键列表,检查值是否设置正确。
答案 3 :(得分:4)
也可以在不使用反射的情况下完成。
解决方案是动态的。当您的类使用新字段进行扩展时,您无需将它们添加到列表中或添加另一个空检查。
注意:
我使用了Lombok的EqualsAndHashCode注释。
您必须确保默认构造函数不是使用自定义行为实现的,并且您的字段没有内置java默认值以外的默认值(引用类型为null,int为0等)。
@EqualsAndHashCode
public class User
{
private static User EMPTY = new User();
private String id = null;
private String name = null;
private User()
{
}
public User(String id, String name)
{
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isEmpty()
{
return this.equals(EMPTY);
}
}
答案 4 :(得分:3)
溪流怎么样?
public boolean checkFieldsIsNull(Object instance, List<String> fieldNames) {
return fieldNames.stream().allMatch(field -> {
try {
return Objects.isNull(instance.getClass().getDeclaredField(field).get(instance));
} catch (IllegalAccessException | NoSuchFieldException e) {
return true;//You can throw RuntimeException if need.
}
});
}
答案 5 :(得分:2)
在我看来,最好的方式是反思,正如其他人所推荐的那样。这是一个评估每个本地字段为null的示例。如果找到一个非null,则method将返回false。
public class User {
String id = null;
String name = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isNull() {
Field fields[] = this.getClass().getDeclaredFields();
for (Field f : fields) {
try {
Object value = f.get(this);
if (value != null) {
return false;
}
}
catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return true;
}
public static void main(String args[]) {
System.out.println(new User().isNull());
}
}
答案 6 :(得分:2)
如果您想将此用于单元测试,我只使用hasNoNullFieldsOrProperties()
中的assertj
方法
assertThat(myObj).hasNoNullFieldsOrProperties();
答案 7 :(得分:1)
Field[] field = model.getClass().getDeclaredFields();
for(int j=0 ; j<field.length ; j++){
String name = field[j].getName();
name = name.substring(0,1).toUpperCase()+name.substring(1);
String type = field[j].getGenericType().toString();
if(type.equals("class java.lang.String")){
Method m = model.getClass().getMethod("get"+name);
String value = (String) m.invoke(model);
if(value == null){
... something to do...
}
}
答案 8 :(得分:1)
我认为这是一个可以轻松解决您的问题的解决方案:(如果任何参数都不为null,则返回true)
public boolean isUserEmpty(){
boolean isEmpty;
isEmpty = isEmpty = Stream.of(id,
name)
.anyMatch(userParameter -> userParameter != null);
return isEmpty;}
同一任务的另一个解决方案是:(您可以将其更改为if(isEmpty == 0)检查所有参数是否为空。
public boolean isUserEmpty(){
long isEmpty;
isEmpty = Stream.of(id,
name)
.filter(userParameter -> userParameter != null).count();
if (isEmpty > 0) {
return true;
} else {
return false;
}
}