50

これは、クラスが初期化されたが、変数が設定されなかったことを意味します。

サンプル クラス:

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;
    }
}

実際のクラスは巨大なので、変数ごとに if(xyz == null) をチェックしたくありません。

4

12 に答える 12

87

Java 8 の別の非反射ソリューションは、paxdiabo の回答の行にありますが、一連のif's を使用せずに、すべてのフィールドをストリーミングし、null をチェックすることです。

return Stream.of(id, name)
        .allMatch(Objects::isNull);

これは、リフレクションハンマーを回避しながら維持するのが非常に簡単なままです。

于 2016-10-25T11:36:30.170 に答える
49

次のようなことを試してください:

public boolean checkNull() throws IllegalAccessException {
    for (Field f : getClass().getDeclaredFields())
        if (f.get(this) != null)
            return false;
    return true;            
}

可能であれば、各変数をチェックする方がおそらく良いでしょう。

于 2012-09-11T03:15:53.437 に答える
4

「最高」はそのような主観的な用語です:-)

個々の変数をそれぞれチェックする方法を使用します。クラスにすでにこれらがたくさんある場合、次のようなことをしても、サイズの増加はそれほど大きくなりません。

public Boolean anyUnset() {
    if (  id == null) return true;
    if (name == null) return true;
    return false;
}

すべてを同じ順序に保てば、コードの変更 (および、偏執狂的な場合はスクリプトによる自動チェック) は比較的簡単になります。

あるいは (それらがすべて文字列であると仮定して)、基本的にこれらの値をある種のマップ (たとえばHashMap) に入れ、そのリストのキー名のリストを保持することもできます。そうすれば、キーのリストを反復処理して、値が正しく設定されていることを確認できます。

于 2012-09-11T03:14:30.357 に答える
3

私の意見では、他の人が推奨しているように、Reflectionが最善の方法です。これは、各ローカルフィールドのnullを評価するサンプルです。nullでないものが見つかった場合、メソッドは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());
    }
}
于 2012-09-11T03:57:40.123 に答える
2
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...
                }
}
于 2012-09-11T03:20:58.953 に答える
0

反対のことをしたい場合、つまりクラスの一部/すべてのメンバーが非非非であるかどうかを確認するには、この回答を確認してください。

クラスの特定のメンバーが常に非 null であることを確認するために、クラス@NonNullの個々のフィールドで lombok アノテーションを使用できます。

import lombok.Data;
import lombok.NonNull;

@Data
public class DataClass {
  @NonNull
  private String data1;
  private int data2;
  @NonNull
  private String data3;
  @NonNull
  private String data4;
  @NonNull
  private String data5;
  private String data6;

 DataClass(String data1,...) {
    // constructor
 }
}
于 2021-09-20T05:58:22.387 に答える
0

Irkwzの答えに基づいていますが、別のアプローチです:

public class SomeClass{

private String field1;
private String field2;
private ComplexField field3;
private String field4;
private Integer field15;

public boolean isNullAllFields() {
    return Stream.of(this.getClass().getDeclaredFields()).anyMatch(element -> (element != null));
}

}

そして一日の終わりに isNullAllFields メソッドを呼び出して、オブジェクト フィールドが空かどうかを調べます。

于 2021-10-12T13:02:45.203 に答える