ロンボクを使用した明示的なコンストラクター?
質問
データベースを管理する乱雑なコードを書き直しており、元のプログラマーが次のようなデータベースにマッピングされたクラスを作成したことがわかりました。
(この質問に目的のない不要なコードを削除しました)
@Entity
@Data
@EqualsAndHashCode(callSuper = false, of = { "accessionCode", "header", "date" })
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
protected PDBEntry(){}
public PDBEntry(String accessionCode, String header, Date date){
this.accessionCode = accessionCode;
this.header = header;
this.date = date;
}
}
私はまだHibernateとLombokを使用している初心者ですが、これは同じことをしていないし、Lombokはあなたに必要なコンストラクターを自動的に作成しませんか?
@Entity
@Data
@SuppressWarnings("PMD.UnusedPrivateField")
public class PDBEntry implements Serializable {
@Id
@NaturalId
@NotEmpty
@NonNull
@Length(max = 4)
private String accessionCode;
@NaturalId
@NotEmpty
@NonNull
private Date date;
@NaturalId
// We allow for the header to be 'null'
private String header;
private Boolean isValidDssp;
@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated = new Date(System.currentTimeMillis());
}
また、このコードの元のプログラマーは、ヘッダーを「ヌル」にすることを許可しているが、ヘッダーに値を必要とするコンストラクターを明示的に作成したと述べています。私は何かが足りないのですか、それともこれは少し矛盾していますか?
解決
見て @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
.
のコンストラクターの動作 @Data
のようなものです @RequiredArgsConstructor
:
@requiredargSconstructor特別な取り扱いが必要な各フィールドに1パラメーターを持つコンストラクターを生成します。すべての最終フィールドは、パラメーターと、宣言された場所で初期化されていない@nonnullとしてマークされたフィールドを取得します。
あなたのフィールドはどれもいないことを考えると、どちらもそうではありません final
また @NonNull
, 、これにより、アーグメントなしコンストラクターになります。ただし、これはこの行動を達成するための最も表現力のある方法ではありません。
この場合、おそらくあなたが望むのはaです @NoArgsConstructor
(オプションではaと組み合わされます @AllArgsConstructor
)、ドキュメントにも示されているように、意図した動作を明確に伝えるには。
HibernateやService Provider Interfaceなどの特定のJavaコンストラクトには、ARGSコンストラクターが必要です。この注釈は、主に@Dataまたは他のコンストラクター生成注釈のいずれかと組み合わせて役立ちます。
他のヒント
そのビットはあなたが正しい矛盾しています。 Lombokを使用したことはありませんが、Beanを作成して持続できるようにしたい場合は、上記のようにデフォルトのコンストラクターが必要な場合、私が知っていたように、冬眠を使用しています。 constructor.newinstance()を使用して、新しいオブジェクトをインスタンス化します。
以下は、より詳細に進む冬眠ドキュメントをいくつか紹介します。
@nonnullフィールドを備えた@Dataを使用していて、それでもノアルグの建設者が必要な場合は、3つのアノテーションすべてを一緒に追加してみてください。
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
どうやら古い Intellij Eclipse KeplerとLombok v0.11.4で複製したバグ
@NoArgsConstructor,
@RequiredArgsConstructor,
@AllArgsConstructor
引数を取得しないコンストラクター、最終 /非ヌルのフィールドごとに1つの引数、またはすべてのフィールドの1つの引数を生成します。これを読む Lombok-Project
@Data
@RequiredArgsConstructor /*Duplicate method Someclass() in type Someclass*/
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true) /*Duplicate method Someclass() in type Someclass*/
@Entity
public class Someclass {
@Id
private String id;
private String name;
private Type type;
public static enum Type { X , Y, Z}
}
メンバー変数を最終的にすることで修正しました
@Data
@RequiredArgsConstructor
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
@Entity
public class Someclass {
@Id
private final String id;
private final String name;
private final Type type;
public static enum Type { X , Y, Z}
}