24

次の行を検討してください。

if (object.getAttribute("someAttr").equals("true")) { // ....

明らかに、この行は潜在的なバグであり、属性がバグである可能性がnullあり、NullPointerException. したがって、次の 2 つの選択肢のいずれかにリファクタリングする必要があります。

最初のオプション:

if ("true".equals(object.getAttribute("someAttr"))) { // ....

2 番目のオプション:

String attr = object.getAttribute("someAttr");
if (attr != null) {
    if (attr.equals("true")) { // ....

最初のオプションは読みにくいですが、より簡潔です。2 番目のオプションは意図は明確ですが、冗長です。

読みやすさの観点から、どのオプションを好みますか?

4

9 に答える 9

27

私はいつも使ってきました

if ("true".equals(object.getAttribute("someAttr"))) { // ....

読むのは少し難しいですが、それほど冗長ではなく、十分に読みやすいと思うので、非常に簡単に慣れることができます。

于 2009-06-08T08:51:55.400 に答える
18

2 番目のオプションでは、短絡を利用できます&&

String attr = object.getAttribute("someAttr");
if (attr != null && attr.equals("true")) { // ....
于 2009-06-08T08:55:45.673 に答える
2

簡潔なアプローチが最初は間違っていると感じても、実際には慣用的なものになる特定の状況があります。これはその 1 つです。もう1つは次のようなものです:

String line;
while ((line = bufferedReader.readLine()) != null) {
  // Use line
}

状態の副作用?考えられない!ただし、特定のパターンを認識すると、基本的に代替案よりも優れています。

このパターンは似ています。Java では非常に一般的であるため、ある程度の経験を積んだ開発者であれば認識できると思います。結果は快適に簡潔です。(面白いことに、不必要に同じイディオムを使用する C# コードを時々見かけます。等価演算子は C# の文字列で正常に機能します。)

結論: 最初のバージョンを使用して、それに慣れてください。

于 2009-06-08T09:02:57.077 に答える
1

私はオプション1が好きで、十分に読みやすいと主張します.

オプション 3 は、パラメーターとしてデフォルト値を取る getAttribute メソッドを導入することです。

于 2009-06-08T08:53:05.427 に答える
1

どちらも機能的に同等であることを考えると、常に短いコードを目指してください。特に、読みやすさが犠牲にならないこのような場合。

于 2009-06-08T08:56:58.337 に答える
0

別の答えがあります。

List<Map<String, Object>> group = jjDatabase.separateRow(db.Select("SELECT * FROM access_user_group  WHERE user_id=1 ;"));

私のデータベースには「access_user_group」の列として「group_c80」がないため、get(0).get("group_c80") で null ポインター例外が発生します。しかし、私は以下のコードでそれを処理しました:

for (int j = 1; j < 100; j++) {
                    String rulId="0";//defult value,to privent null pointer exeption in group_c
                    try {
                        rulId = group.get(0).get("group_c" + j)).toString();
                    } catch (Exception ex) {
                        ServerLog.Print( "Handeled error in database for " + "group_c" + (j < 10 ? "0" + j : j) +"This error handeled and mot efect in program");
                        rulId = "0";
                    }}
于 2015-03-05T18:33:33.353 に答える
0

これが私のアプローチですが、PropertyUtilクラスが必要ですが、一度しか書かれていません:

/**
 * Generic method to encapsulate type casting and preventing nullPointers.
 * 
 * @param <T>          The Type expected from the result value.
 * @param o            The object to cast.
 * @param typedDefault The default value, should be of Type T.
 * 
 * @return Type casted o, of default.
 */
public static <T> T getOrDefault (Object o, T typedDefault) {
    if (null == o) {
        return typedDefault;
    }
    return (T) o;
}

クライアントコードはこれを行うことができます:

PropertyUtil.getOrDefault(obj.getAttribute("someAttr"), "").equals("true");

または、リストの場合:

PropertyUtil.getOrDefault(
    genericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST
).contains(element);

または、オブジェクトを拒否する List の消費者に対して:

consumeOnlyList(
    PropertyUtil.getOrDefault(
        enericObjectMap.get(MY_LIST_KEY), Collections.EMPTY_LIST
    )
)

デフォルトは、null オブジェクト パターンの実装である可能性がありますhttps://en.wikipedia.org/wiki/Null_Object_pattern

于 2016-04-29T15:31:49.543 に答える
0

とても良い質問です。私は通常、優雅ではないを使用します。

if (object.getAttribute("someAttr") != null && object.getAttribute("someAttr").equals("true")) { // ....

(そしてもう使わない)

于 2009-06-08T09:03:37.387 に答える
0

Util.isEmpty(string)- を返すのstring == null || string.trim().isEmpty() Util.notNull(string)場合は ""を返しstring == null、そうでない場合は文字列を返します。 Util.isNotEmpty(string)戻り値 !Util.isEmpty(string)

また、文字列の場合、Util.isEmpty(string)意味的に真をUtil.isNotEmpty(string)意味し、意味的に偽を意味するという規則があります。

于 2009-06-08T08:55:23.207 に答える