0

私は簡単なコードを持っています:

txtRequiredDate.setText(wwDateFormatter.format(todoEntity.getRequiredDate()));
txtRequiredDateDay.setText(dayOfWeek(todoEntity.getRequiredDate()));
txtDoneDate.setText(wwDateFormatter.format(todoEntity.getDoneDate()));
txtDoneDateDay.setText(dayOfWeek(todoEntity.getDoneDate()));

問題は、日付が null になる場合があることです (記入はオプションであるため)。そのような場合、wwDateFormatter は NullPointerException をトリガーします。

私が見ているように、それを修正する1つの方法は次のとおりです。

if (todoEntity.getRequiredDate() != null) 
{
    txtRequiredDate.setText(wwDateFormatter.format(todoEntity.getRequiredDate()));
    txtRequiredDateDay.setText(dayOfWeek(todoEntity.getRequiredDate()));
}

if (todoEntity.getDoneDate() != null)
{
    txtDoneDate.setText(wwDateFormatter.format(todoEntity.getDoneDate()));
    txtDoneDateDay.setText(dayOfWeek(todoEntity.getDoneDate()));
}

しかし、上記のステートメントをより簡潔に書く方法があるかどうか疑問に思っていましたか?

ありがとう!

編集これが最適化されていないということではなく、null をチェックするさまざまな方法を学びたいという事実です。特に、これらのステートメントを 30 個持たなければならない状況が発生した場合はそうです

4

3 に答える 3

3

nullが渡された場合に空の文字列を返すnull対応のバリアントでフォーマッタをラップしてみませんか?

NullObjectPatternにも興味があるかもしれません。また、ScalaのパターンとJavaでの同等のパターンについて説明しているこのブログにも注意してください。Optionこれらは両方とも、上記の問題を軽減するために利用できる非常に便利なパターンです。

于 2012-06-26T13:43:44.983 に答える
2

日付文字列が決して null でないことを確認してください (空の文字列を使用してください:""代わりに) - これ以上 if は必要ありません。

または、null 以外のユーティリティ メソッドを使用することもできます (Brian が提案したものと同様)。

private String nonNull(String s) {
    return (s == null ? "" : s);
}

public void yourMethod() {
    txtRequiredDate.setText(wwDateFormatter.format(nonNull(todoEntity.getRequiredDate())));
    txtRequiredDateDay.setText(dayOfWeek(nonNull(todoEntity.getRequiredDate())));
    ...
}
于 2012-06-26T13:42:18.707 に答える
2

これは、可能であればアクセサー/プロパティを避けるべき典型的な理由です。エンティティの「生の」データを公開するのをやめて、ロジックをエンティティ自体の中に入れてみてください。そうすれば、null チェックが 1 か所でできます。

txtRequiredDate.setText(todoEntity.formattedRequiredDate())

...代わりにエンティティメソッドでnullチェックを行う場所(空の文字列またはnullの場合は何でも返します)。

ゲッターとセッターが本当に悪かどうか、このテーマの古い古典的な記事は議論の余地がありますが、少なくともエンティティを設計するときにカプセル化を念頭に置くことは良いことです.

于 2012-06-26T14:03:07.113 に答える