5

Javaで「null」を処理するためのベストプラクティス(特に「List」が返される)と言えば、エンティティクラスのgetMethodから「Collections.emptyList()」を返すのは良い習慣ですか?または、エンティティ/データクラス/メソッドをきちんと整理し、常にその値(nullであっても)を返し、コード内の別の場所でそのnullを処理する必要があります。

Class Reference{

private Reference reference;

@XmlElement(name = "Reference")
public List<Reference> getReference() {
    if(reference==null){
        return Collections.emptyList();
    }
    return reference;
}

public void setReference(List<Reference> reference) {
    this.reference = reference;
}
}

または、基本的なgetメソッドを使用した後のnullを処理する方がよいでしょうか。

編集/警告:私のシナリオでは、このアプローチでコードがクラッシュすることに気づきました。後で電話するときに、理由はわかりません。

References ref= (References) jaxbUnmarshaller.unmarshal(xmlReader)

サポートされていない操作の例外が発生しますが、collections.emtpyListからgetMethodをクリーンアップすると問題なく動作します。したがって、@XmlElementタグと一緒に使用する場合は注意が必要です

4

5 に答える 5

3

一般にnull、「空」は異なるセマンティクスを持つことができます。null「空」は「そこにあるが、そこには何もない」ことを意味します。

クラスが「notthere」と「empty」の間に意味上の違いがない場合は、空のコレクションを返す方が適切です。これにより、ifすべての呼び出し元にステートメントが保存され、コードがよりクリーンに見えます。さらに、この場合、最初はに設定this.referenceし、ゲッターからCollections.emptyList()を削除しました。ifもちろん、この場合、セッターはnull引数をチェックする必要があります。

于 2012-11-01T12:33:26.117 に答える
3

私の経験では、Javaをコーディングするときに「契約によるプログラミング」または「契約による設計」(リンク)が使用されます。
これは、あなたの例では、参照が外部エンティティによって設定されていない場合、単にnullを返すことを意味します。

于 2012-11-01T12:34:41.043 に答える
2

null以外のコレクションを返すことは確かに良い習慣です。これにより、すべての発信者が実行する必要がなくなります

if (list != null) {
    for (Item i : list) {
        ...
    }
}

したがって、上記のコードは問題ありません。referenceただし、変数にnull値を含めないようにするとさらに細かくなります。リストのセッターがある場合、渡されたリストがnullの場合は例外をスローするようにするか、nullを空のコレクションに変換します。このように、クラス内のコードでさえ、参照変数がnullであることを気にする必要はありません。

nullリストと空のリストを区別する必要がある場合は、GuavaのOptionalクラスを使用することを検討してください。これにより、状況がより明確になります。

注:リストがあるので、変数にはreferences(最後のsを付けて)名前を付け、アクセサーにはとという名前を付ける必要がgetReferencesありsetReferencesます。

于 2012-11-01T12:33:59.097 に答える
1

一般的に:依存します(欠落しているリストと空のリストを区別できる必要がある場合)。

XMLアクセスライブラリの場合、常に可変リストを返す規則があるようです。これにより、エンティティを更新できます。少なくとも、それはすべての自動生成されたWS-*コードが行うことです。

たとえば、参照を追加するには、次のようにします

x.getReferences().add(someReference);

nullを返した場合、例外が発生します。

OTOH、その規則には参照リストのセッターがないか、必要ありません(新しいリストを設定する代わりに、リストをクリアしてすべてを追加するだけです)。

于 2012-11-01T12:33:42.253 に答える
1
private Reference reference = Collections.emptyList();

public List<Reference> getReference() {
    return reference;
}

public void setReference(List<Reference> reference) {
    if(reference==null) 
        reference = Collections.emptyList();
    this.reference = reference;
}
于 2012-11-01T17:12:49.190 に答える