エレガントなエンティティクラスを書くために、サードパーティ製のプラグインを使用する方法
まず第一に、ここではすべての人のが不思議何を解決するために、サードパーティのプラグインとは何でしょうか?エンティティクラスとは何ですか?
まず:サードパーティ製のプラグ手段:Lombok
第二:エンティティクラス手段:誰も開発 bean\pojo\entity
以下の... ...持って来るにロンボク島の便利なプログラミングの紹介を持っています
1.ORMのエンティティクラス
ときjava Bean
のように、クラスORM
エンティティクラス、またはxml、json
マッピングクラスは、必要なこのクラスには、いくつかの機能があります。
- 私たちは、引数のコンストラクタを持っていません。
- 持っている
toString()
方法を。 - それは持っている
setter
、逆シリアル化するための方法を、 - それは持って
getter
シリアライズする方法を。
まず、簡単な例
package xyz.mrzhangxd.lombokProject;
import lombok.Data;
@Data
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
ブラッシュアップ:@Data
国会に相当の注意を@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode
2.Builder
頻繁にツールの多くで使用されるモードの設定、。
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
@Builder
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
質問があるので、@Builder
どのようなもので、ここで何をしましたか... ...
- これは、作成し
private
、フル引数のコンストラクタを。どの手段引数なしのコンストラクタではありません。それはまた、このクラスは直接オブジェクトを構築することができないことを意味します。 - これは、同じ名前、場所に割り当てられた各属性のメソッドを作成
setter
し、この方法は、オブジェクト自体の値を返します。
練習何をしましょう、さあ:
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean();
ub.userId(1001);
ub.userName("MrZhangxd");
ub.passWord("123456");
ub.build();
System.out.println(u);
}
これはしかし、及び無益、Bean
ないgetter
方法は、データ内に直接使用することはできません。:ちょうどあなたがこの事の出力が見つけていきます、役に立たないと言うxyz.mrzhangxd.lombokProject.UserBean@20322d26
、でも何ものを見るために見ていません。したがって、Builderは可能性を、実際の必要性のより多くのものを提供します。
だから、我々はテストを容易にするために、追加する必要がある @ToString()
ノートを、意志の出力 UserBean(userId=1001, userName=MrZhangxd,passWord=123456)
子供たちのいくつか追加していないようなので、ToString
注釈を、私はに彼を回しjson
出力:
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean();
ub.userId(1001);
ub.userName("MrZhangxd");
ub.passWord("123456");
ub.build();
ObjectMapper om = new ObjectMapper();
System.out.println(om.writeValueAsString(u));
}
もちろん、私はあなたに嘘をした、それは次の例外が表示されます。
```com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class``` xyz.mrzhangxd.lombokProject.UserBean``` and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
だから、間違いで、我々は我々の調査やバグの大きな動きを思い付く、およびオンラインの開発に大きな動きます... ...
参照してくださいno properties discovered
何がありますので、はい、ツールプロパティは、見つけることができないことをgetter
、我々は追加しない @Getter
ことを。
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
シリアライズjson
その後、1から、それjson
には抗シーケンスオブジェクトに?
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Builder
@Getter
@Setter
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
この賞では子供たちにおめでとうございます、我々は遭遇する com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of
xyz.mrzhangxd.lombokProject.UserBeanを(no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
既にのみ説明を加えたよう @Setter
十分ではありません、我々はまた、引数なしのコンストラクタが必要です。そして、次のことができますか?
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
同じことはできません、けれどもので、Data
時間の使用が直接使用することができ、引数のコンストラクタは、しかしためのBuilder
フル引数のコンストラクタの導入、その後に従ってjava
ネイティブ、非引数コンストラクタのルールではありません。そして、引数なしのコンストラクタと相まって
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@Data
@NoArgsConstructor
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
しかし、Builder
別のエラーが、それはライン上でフル引数のコンストラクタ、最終的には、ユニークなスキルを見つけることができません... ...
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
- 全引数のコンストラクタのアクセスレベルは、破壊しないことに注意してください
Builder
ルールを。
今、私たちは、リストでエンティティクラスを参照するために一歩近づいています
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
//用户地址
private List<String> address;
}
これは、List
我々はまた、新しい外を必要としArrayList
、その後、build
使い心地、内部ではありません。lombok
それは、アノテーションの使用、と別のものを提供し @Singular
、次のように、:
package xyz.mrzhangxd.lombokProject;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Singular;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
//用户地址
@Singular
private List<String> address;
}
次のテスト... ...
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean()
.userId(1001)
.userName("MrZhangxd")
.passWord("123456")
.address("beijing")
.address("shanghai")
.build();
}
ここに書く、子供たちは私に、それは、単にドーハを良い感じではない賞賛を与えることはない、とも提供してclearXXX
コレクションを空にするための方法を。
小さなピットは、我々が追加する場合もあり、title
財産を、それをデフォルト値を与えます:
package xyz.mrzhangxd.lombokProject;
import xyz.mrzhangxd.lombokProject.UserBean;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
private String title = "爱你么么哒...";
}
シニアプログラマーとして、私はほとんど一つのことをやりたいここに書きましたか??あなたは... ...である、ユニットテスト、波を取る、来る、来る、間違っていません
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean()
.userId(1001)
.userName("MrZhangxd")
.passWord("123456")
.build();
System.out.println(ub.toString());
}
まあ、エキサイティングな時間は、次のような出力を見てみましょう:
UserBean(userId=1001,uaerName=MrZhangxd,passWord=123456,title=null)
うんうんうん、ああではありませんか?title
それはどのように空のだろうか??これがあるべきBuilder
説明する原則、彼が実際に属性値の集合であるセットリストされ、その後、フル引数コンストラクタを使用してオブジェクトを作成します。だから、豆のデフォルトは、ないBuilder
上、そのBuilder
譲渡をした、その値はnull
、最終的にすべての属性がにコピーされますUserBean
ので、 `、nul
Lは、デフォルト値を上書きします。
どのように取得するBuilder
エンティティは、デフォルト値を持っていますか?ただ、@defaultコメントを増大させることができるフィールドレベルを与えます。
package xyz.mrzhangxd.lombokProject;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Builder.Default;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
@Default
private String title = "爱你么么哒...";
}
心は、上の夢場合は、もう一度すべてをやり直します... ...
さあ、来て、負けない心を行い、出力かどうかを確認するためのテスト:
UserBean(userId=1001,uaerName=MrZhangxd,passWord=123456,title=爱你么么哒...)
3.Wither
wither
建物オブジェクトモード、Objective-C
より一般的です。
シナリオは、オブジェクトを構築するために必要ないくつかのパラメータ、他のパラメータ、動的アセンブリを使用して、適用可能です。例えば、我々は構築されApiClient
、それが彼の、ユーザー名とパスワードが必要なのですApiService
アドレスはデフォルト値を持っているし、我々は、このアドレスをカスタマイズすることができます。
package xyz.mrzhangxd.lombokProject;
import lombok.AllArgsConstructor;
import lombok.experimental.Wither;
@Wither
@AllArgsConstructor
public class ApiClient {
private String appId;
private String appKey;
private String endpoint="http://api.xxxx.com/xxx";
}
質問があるので、どのようにああ使用します
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.ApiClient;
@Test
public class lombokDemoTest(){
ApiClient aclient = new ApiClient(null,null,null);
System.out.println(aclient);
Object aclient1 = aclient.withAppId("20200107")
.withAppKey("MrZhangxd")
.withEndpoint("http://192.168.xxx.xxx/");
System.out.println(aclient1);
}
デフォルトの使用null
オブジェクトを初期化するためには非常に奇妙です。そして、Builder
としてWither
も実用化の可能性を提供していますまた、それを調整する必要があります。
次のように我々は、必須パラメータのコンストラクタを設定することができます。
package xyz.mrzhangxd.lombokProject;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Wither;
@RequiredArgsConstructor
@Wither
@AllArgsConstructor
public class ApiClient {
@NonNull
private String appId;
@NonNull
private String appKey;
private String endpoint="http://api.xxxx.com/xxx";
}
子供たちに伝えるために非常に自信を持って、楽器をすることができます... ...
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.ApiClient;
@Test
public class lombokDemoTest(){
ApiClient aclient=new ApiClient("20200107", "MrZhangxd");
System.out.println(aclient);
Object aclient1 = aclient.withEndpoint("http://192.168.xxx.xxx/");
System.out.println(aclient)1;
}
それは上品な種類ではなく、実際に使用するチェーンの構文を使用して、ブロガーに教えます:
ApiClient client1=new ApiClient("20200107", "MrZhangxd").
withEndpoint("http://192.168.xxx.xxx/");
小さなディテール、前述の例次の出力もあります。
xyz.mrzhangxd.lombokProject.ApiClient@786830e
xyz.mrzhangxd.lombokProject.ApiClient@470e7030
ログは、()でオブジェクトを返す、ということを示している本来の目的ではありませんが、非常に重要であり、新しいオブジェクト、。
4.Accessors
アクセス・モードは、読み取りおよび書き込みなど、豆の一般的な増加の便利なアクセスデバイスを、提供することです。
これは、例示した、2つの動作モード、流暢とチェーンがあります。
package xyz.mrzhangxd.lombokProject;
import lombok.Accessors;
import lombok.Data;
@Data
@Accessors(fluent = true)
public class UserBean{
//用户id
private Integer userId;
//用户名
private String userName;
//用户密码
private String passWord;
}
質問があるので、どのようにああ使用します
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean()
.userId(1001)
.userName("MrZhangxd")
.passWord("123456");
ub.setUserName("MrZ")
System.out.println(ub.getUserName());
}
これはBuilder
似ていますが、より小さく、かつ読み書き特性に影響を与えませんが、プロパティは、文字列と同じ名前を使用しての代わりに、getter
とsetter
。
別のモデルは、チェーンです。
package xyz.mrzhangxd.lombokDemo;
import xyz.mrzhangxd.lombokProject.UserBean;
@Test
public class lombokDemoTest(){
UserBean ub = new UserBean()
.setUserId(1001)
.setUserName("MrZhangxd")
.setPassWord("123456");
ub.setUserName("MrZ")
System.out.println(ub.getUserName());
}
見ることができ、このfluent
違いは、使用することであるgetter
とsetter
。