Java 检查对象是否为空

Java 检查对象是否为空,java,Java,如何检查以下对象是否为空?我有下面的类,如果不检查样本类的每个成员,我如何检查样本类没有任何数据 public class Test { public static void main(String[] args){ Sample sample = new Sample(); if(sample!=null){ System.out.println("Object is blank.."); } } }

如何检查以下对象是否为空?我有下面的类,如果不检查样本类的每个成员,我如何检查样本类没有任何数据

public class Test {


    public static void main(String[] args){
        Sample sample = new Sample();

        if(sample!=null){
            System.out.println("Object is blank..");
        }
    }
}

class Sample {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


}

创建布尔标志并在setters中操作它的一个选项

将私有isBlank设置为空:

private boolean isBlank=true;
然后让setter调用
isBlank=false
。任何setter调用都会使对象不为空。然后添加一个getter
checkIsBlank(
返回
isBlank


请注意,设置程序应该检测到设置为null。在这种情况下,他们需要检查所有字段。这留给读者作为练习。

我假设对象为空,意味着实例变量没有初始化。我认为没有任何可用的方法来检查对象的这种空。 如果必须这样做,那么您可能需要编写自己的方法来检查文件。您应该检查原语的默认值,并检查对象类型的null。您的类的此类方法的一个示例是:

public boolean isEmpty() {
    if(this.id == 0 && this.name == null)
        return true;
    else
        return false;
}

请不要认为这是完美的实现方式,所以根据您的需要定制。

< P>您可以通过将对象与新实例化对象进行比较来检查该对象是否为空。
public boolean isBlank() {
    return this.equals(new Sample());
}

@Override
public boolean equals(Object o) {
    boolean toRet;
    if(o == null || !o instanceof Sample) {
         toRet = false;
    }
    else {
        Sample b = (Sample) o;
        toRet = this.id == b.id 
            && (this.name == null ? b.name == null : this.name.equals(b.name));
    }
    return toRet;
}

旧答案:您可以创建一个修改后的布尔值,初始化为false,然后在调用setter时将其设置为true

class Sample {
    public static final int INVALID_ID = -1;
    private int id = Sample.INVALID_ID;
    private String name = null;
    private boolean modified = false;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
        modified = true;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        modified = true;
    }

    public boolean isModified() { 
        return modified;
    }
}

首先,您需要定义“blank”在业务术语中的含义。“blank”对象到底是什么?它是具有空名称的对象吗?具有空字符串名称吗?具有其他一些空参数组合吗

一旦定义了“空白”对象的实际含义,我建议添加一个方法,根据对象的当前内容执行该逻辑并返回结果:

public boolean isBlank () {
    return ...; // whatever "blank" means
}

如果可能的话,我建议不要使用基于标志的方法。虽然确实有充分的理由,但添加标志意味着您的设置程序必须始终保持标志的正确值(并且您还必须在反序列化后更新).

我要做的是,提供一个接受id和名称的构造函数,因此您知道对象永远不会为空:

public class Sample{
  private int id;
  private String name;

  public Sample(int id, String name){
    this.id = id;
    this.name = name;
  }
}
您可以对当前类进行的一种攻击是重写toString方法:

class Sample {
    private int id;
    private String name;

    @Override
    public String toString(){
      try{
        return Integer.toString(id) + name;
      } catch(Execption e){
        return "";
      }
    }
}

if(sample.toString().isEmpty())
  System.out.println("Object is blank");

您需要创建一个布尔标志并在setters中操作它,如果您担心的是代码重复而不是性能,您可以向
Sample
添加一个
isBlank()
方法来检查每个成员,并在必要时调用它。此时Sample将永远不会为null。@hexafractionBy“blank”的+1,您的意思是“未设置任何字段”?或者您是否将“blank”等同于
null
?那么
对象呢。requirennoull()
?修改后的变量仍然需要一个getter。代码应该在块外或注释中包含解释。OP询问如何确定对象是否为“blank”,而不是“modified”“。OP的关键点是,他需要在商业术语中定义“空白”。@JasonC-Modified==非空白。为了澄清,由于原始海报没有指定空白的特定条件,我采用了一种通用方法。如果您将其修改为空白,则不需要。
setName(null);setId(0)这是一个很好的答案。值得向OP强调的是,在实现此方法之前,他们必须定义“blank”的实际含义。虽然这看起来很明显,但你不想教OP盲目检查所有字段是否为0/null/false。这只适用于0不是有效的
id
。如果程序可以调用setId(0)合法地说,那么您需要的不仅仅是上述内容。这是一个非常常见的编程错误。如果setId(0)错误,那么setId的代码应该对此进行检查,如果它得到一个无效的id,则抛出一个异常。@ajb很好;这也与要求OP定义什么“空白”有关是指。但是,如果一个ID实际上可以具有“未分配”的状态,最好使用
整型
作为ID,并使用
null
表示这一点,而不是使用特殊用途的常量值。如果可能,我建议不要使用标志方法。使用它当然有理由,但如果可能,可以根据字段的当前值随时检查它是否为空,那么您不需要维护setters的标志(反序列化后也不需要维护)。我认为这是一个有效的答案,但您应该将“you'll need to”替换为“One option is to”,以免误导OP。这是一个非常好的答案。如果您声明不变量“不存在空白样本”,将所需字段隐式地放在构造函数中可以保证这一点(只要setter也验证输入,并且您不能,例如,
setName(null);setId(0);
),如果基于标志的方法的替代方法是发明特殊的“empty”像
id
这样的字段的值有其自身的问题,因为稍后可能有人会决定您选择的特殊值应该是合法值。我发现使用标志更可取,因为它不太“棘手”。另一种方法是将
id
设为整数对象,因为它可以为null以表示“无值”@ajb如果业务定义为“blank”,则无需为
id
发明一个特殊的“空”值不涉及id。这取决于id是否为业务密钥。根据用法,您可以认为空白样本是一个没有名称的样本。如果id不是业务密钥,而是一个数据库密钥,则无名样本无论是否在数据库中都是空的。(当然,你可以继续争论db主键应该与业务键相同,但这是另一个话题)。如果你在空白的定义中包含
id
,那么解决方案就是使用
Integer
表示
id
,其中
null
表示“没有分配id”,而不是发明一些