web-dev-qa-db-ja.com

リストがnombokゲッターでnullの場合、リストを初期化しますか?

現在、すべての定型コードにLombokを使用するために、すべての標準POJOを置き換えています。リストが初期化されていない場合は空のリストを返したいため、リストのゲッターを保持しています。つまり、ゲッターがnullを返すのは望ましくありません。私が知らないロンボクの魔法があれば、これを避けることができますか?

生成されたコードの例

private List<Object> list;
public Object getList(){ return list; }

代わりに私が欲しいもの:

private List<Object> list;
public Object getList(){
    if (list == null) {
        return new ArrayList();
    }
    return list;
}
17
L42

これを実現するには、フィールドを宣言して初期化します。囲んでいるオブジェクトが初期化されると、初期化が行われます。

private List<Object> list = new ArrayList();

ロンボク@Getterアノテーションは、遅延初期化を許可する属性lazyを提供します。

 @Getter(lazy=true) private final double[] cached = expensiveInitMethod();

ドキュメント

11
stacker

これと同じ質問がありました。上記の答えはいくつかの点で有用ですが、正確な解決策は @Builderおよび@Singular 以下のコードのようなLombok APIの注釈。

それは私にとって素晴らしい仕事でした。

@Builder
class MyClass{
    @Singular
    private List<Type> myList;
}

これにより、myListがnull以外のListオブジェクトで初期化されます。ただし、この質問は古いものです。しかし、今後この質問を参照する私のような人を助けるために、この回答をまだ投稿しています。

7
ACloudRoamer

つまり、ゲッターがnullを返すのは望ましくありません。私が知らないロンボクの魔法があれば、これを避けることができますか?

魔法を起こす必要はありません。 listを初期化するだけです。

2
Jude Niroshan

フィールドでAccessLevel.NONEを使用して、ゲッターを好きなものでオーバーライドできます。

フィールドを初期化するだけでは、nullを使用してコンストラクターを呼び出したり、nullを使用してセッターを呼び出したりするクライアントから保護されないことに注意してください(必要に応じて、まだ大丈夫かもしれません)。

例えば。

@Getter(AccessLevel.NONE)
private Map<String, String> params;

public Map<String, String> getParams() {
    return (params == null) ? new HashMap<>() : params;
}
1
tkruse