エレガントなエンティティクラスを書くために、サードパーティ製のプラグインを使用する方法

エレガントなエンティティクラスを書くために、サードパーティ製のプラグインを使用する方法

まず第一に、ここではすべての人のが不思議何を解決するために、サードパーティのプラグインとは何でしょうか?エンティティクラスとは何ですか?

まず:サードパーティ製のプラグ手段: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 ofxyz.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ので、 `、nulLは、デフォルト値を上書きします。

どのように取得する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似ていますが、より小さく、かつ読み書き特性に影響を与えませんが、プロパティは、文字列と同じ名前を使用しての代わりに、gettersetter

別のモデルは、チェーンです。

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違いは、使用することであるgettersetter

おすすめ

転載: www.cnblogs.com/MrZhangxd/p/12159865.html