国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

手?jǐn)]lombok

weakish / 3037人閱讀

摘要:靜態(tài)構(gòu)造方法靜態(tài)構(gòu)造方法的語(yǔ)義和簡(jiǎn)化程度真的高于直接去一個(gè)對(duì)象。當(dāng)然,看過(guò)很多源碼以后,我想相信將靜態(tài)構(gòu)造方法換成會(huì)先的更加簡(jiǎn)潔測(cè)試代碼當(dāng)然他仍然是支持鏈?zhǔn)秸{(diào)用的這樣來(lái)寫代碼,真的很簡(jiǎn)潔,并且可讀性很強(qiáng)。

擁抱 lombok,它會(huì)幫助我們解決一些讓我們很煩躁的問(wèn)題

去掉 Setter 和 Getter
    @Setter @Getter public class UserDTO {
        @NotNull
        private String username;
        @NotNull
        private int age;
    
        public User convertToUser(){
            UserDTOConvert userDTOConvert = new UserDTOConvert();
            User convert = userDTOConvert.convert(this);
            return convert;
        }
    
        public UserDTO convertFor(User user){
            UserDTOConvert userDTOConvert = new UserDTOConvert();
            UserDTO convert = userDTOConvert.reverse().convert(user);
            return convert;
        }
    
        private static class UserDTOConvert extends Converter {
            @Override
            protected User doForward(UserDTO userDTO) {
                User user = new User();
                BeanUtils.copyProperties(userDTO,user);
                return user;
            }
    
            @Override
            protected UserDTO doBackward(User user) {
                throw new AssertionError("不支持逆向轉(zhuǎn)化方法!");
            }
        }
    }

看到了吧,煩人的 Getter 和 Setter 方法已經(jīng)去掉了。

bean 中的鏈?zhǔn)斤L(fēng)格

改造前

public class Student {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public Student setName(String name) {
        this.name = name;
        return this;
    }

    public int getAge() {
        return age;
    }

    public Student setAge(int age) {
        return this;
    }
}

相信合理使用這樣的鏈?zhǔn)酱a,會(huì)更多的程序帶來(lái)很好的可讀性,那看一下如果使用 lombok 進(jìn)行改善呢,請(qǐng)使用 @Accessors(chain = true),看如下代碼:

@Accessors(chain = true)
@Setter
@Getter
public class Student {
    private String name;
    private int age;
}

這樣就完成了一個(gè)對(duì)于 bean 來(lái)講很友好的鏈?zhǔn)讲僮鳌?/p> 靜態(tài)構(gòu)造方法

靜態(tài)構(gòu)造方法的語(yǔ)義和簡(jiǎn)化程度真的高于直接去 new 一個(gè)對(duì)象。比如 new 一個(gè) List 對(duì)象,過(guò)去的使用是這樣的:

List list = new ArrayList<>();

看一下 guava 中的創(chuàng)建方式:

List list = Lists.newArrayList();

Lists 命名是一種約定(俗話說(shuō):約定優(yōu)于配置),它是指 Lists 是 List 這個(gè)類的一個(gè)工具類,那么使用 List 的工具類去產(chǎn)生 List,這樣的語(yǔ)義是不是要比直接 new 一個(gè)子類來(lái)的更直接一些呢,答案是肯定的,再比如如果有一個(gè)工具類叫做 Maps,那你是否想到了創(chuàng)建 Map 的方法呢:

HashMap objectObjectHashMap = Maps.newHashMap();

接上上邊的靜態(tài)構(gòu)造方法和必傳參數(shù)的構(gòu)造方法,使用 lombok 將更改成如下寫法(@RequiredArgsConstructor 和 @NonNull):

@Accessors(chain = true)
@Setter
@Getter
@RequiredArgsConstructor(staticName = "ofName")
public class Student {
    @NonNull private String name;
    private int age;
}

測(cè)試代碼:

Student student = Student.ofName("zs");

這樣構(gòu)建出的 bean 語(yǔ)義是否要比直接 new 一個(gè)含參的構(gòu)造方法(包含 name 的構(gòu)造方法)要好很多。

當(dāng)然,看過(guò)很多源碼以后,我想相信將靜態(tài)構(gòu)造方法 ofName 換成 of 會(huì)先的更加簡(jiǎn)潔:

@Accessors(chain = true)
@Setter
@Getter
@RequiredArgsConstructor(staticName = "of")
public class Student {
        @NonNull private String name;
        private int age;
}

測(cè)試代碼:

Student student = Student.of("zs");

當(dāng)然他仍然是支持鏈?zhǔn)秸{(diào)用的:

Student student = Student.of("zs").setAge(24);

這樣來(lái)寫代碼,真的很簡(jiǎn)潔,并且可讀性很強(qiáng)。

使用 builder
@Builder
public class Student {
    private String name;
    private int age;
}

調(diào)用方式:

Student student = Student.builder().name("zs").age(24).build();
代理模式

正如我們所知的,在程序中調(diào)用 rest 接口是一個(gè)常見的行為動(dòng)作,如果你和我一樣使用過(guò) spring 的 RestTemplate,我相信你會(huì)我和一樣,對(duì)他拋出的非 http 狀態(tài)碼異常深惡痛絕。

所以我們考慮將 RestTemplate 最為底層包裝器進(jìn)行包裝器模式的設(shè)計(jì):

public abstract class FilterRestTemplate implements RestOperations {
        protected volatile RestTemplate restTemplate;

        protected FilterRestTemplate(RestTemplate restTemplate){
                this.restTemplate = restTemplate;
        }

        //實(shí)現(xiàn)RestOperations所有的接口
}

然后再由擴(kuò)展類對(duì) FilterRestTemplate 進(jìn)行包裝擴(kuò)展:

public class ExtractRestTemplate extends FilterRestTemplate {
    private RestTemplate restTemplate;
    public ExtractRestTemplate(RestTemplate restTemplate) {
            super(restTemplate);
            this.restTemplate = restTemplate;
    }

    public  RestResponseDTO postForEntityWithNoException(String url, Object request, Class responseType, Object... uriVariables)
                    throws RestClientException {
            RestResponseDTO restResponseDTO = new RestResponseDTO();
            ResponseEntity tResponseEntity;
            try {
                    tResponseEntity = restTemplate.postForEntity(url, request, responseType, uriVariables);
                    restResponseDTO.setData(tResponseEntity.getBody());
                    restResponseDTO.setMessage(tResponseEntity.getStatusCode().name());
                    restResponseDTO.setStatusCode(tResponseEntity.getStatusCodeValue());
            }catch (Exception e){
                    restResponseDTO.setStatusCode(RestResponseDTO.UNKNOWN_ERROR);
                    restResponseDTO.setMessage(e.getMessage());
                    restResponseDTO.setData(null);
            }
            return restResponseDTO;
    }
}

包裝器 ExtractRestTemplate 很完美的更改了異常拋出的行為,讓程序更具有容錯(cuò)性。在這里我們不考慮 ExtractRestTemplate 完成的功能,讓我們把焦點(diǎn)放在 FilterRestTemplate 上,“實(shí)現(xiàn) RestOperations 所有的接口”,這個(gè)操作絕對(duì)不是一時(shí)半會(huì)可以寫完的,當(dāng)時(shí)在重構(gòu)之前我?guī)缀鯇懥税雮€(gè)小時(shí),如下:

public abstract class FilterRestTemplate implements RestOperations {

    protected volatile RestTemplate restTemplate;

    protected FilterRestTemplate(RestTemplate restTemplate) {
            this.restTemplate = restTemplate;
    }

    @Override
    public  T getForObject(String url, Class responseType, Object... uriVariables) throws RestClientException {
            return restTemplate.getForObject(url,responseType,uriVariables);
    }

    @Override
    public  T getForObject(String url, Class responseType, Map uriVariables) throws RestClientException {
            return restTemplate.getForObject(url,responseType,uriVariables);
    }

    @Override
    public  T getForObject(URI url, Class responseType) throws RestClientException {
            return restTemplate.getForObject(url,responseType);
    }

    @Override
    public  ResponseEntity getForEntity(String url, Class responseType, Object... uriVariables) throws RestClientException {
            return restTemplate.getForEntity(url,responseType,uriVariables);
    }
    //其他實(shí)現(xiàn)代碼略。。。
}

我相信你看了以上代碼,你會(huì)和我一樣覺得惡心反胃,后來(lái)我用 lombok 提供的代理注解優(yōu)化了我的代碼(@Delegate):

@AllArgsConstructor
public abstract class FilterRestTemplate implements RestOperations {
    @Delegate
    protected volatile RestTemplate restTemplate;
}

這幾行代碼完全替代上述那些冗長(zhǎng)的代碼。

是不是很簡(jiǎn)潔,做一個(gè)擁抱 lombok 的程序員吧。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74214.html

相關(guān)文章

  • 九宮格抽獎(jiǎng)--手?jǐn)]代碼

    摘要:總是看到類似的九宮格抽獎(jiǎng)效果后來(lái)想自己手?jǐn)]一個(gè)試一試吧。多多嘗試萬(wàn)一成功了呢先來(lái)總結(jié)一下效果類似與跑馬燈效果,閃動(dòng)效果先快后慢。 總是看到類似的九宮格抽獎(jiǎng)效果,后來(lái)想自己手?jǐn)]一個(gè)試一試吧。(多多嘗試,萬(wàn)一成功了呢 github L6zt) 先來(lái)總結(jié)一下效果,類似與跑馬燈效果,閃動(dòng)效果先快后慢。代碼解析如下所示:代碼 0 ...

    zhou_you 評(píng)論0 收藏0
  • 九宮格抽獎(jiǎng)--手?jǐn)]代碼

    摘要:總是看到類似的九宮格抽獎(jiǎng)效果后來(lái)想自己手?jǐn)]一個(gè)試一試吧。多多嘗試萬(wàn)一成功了呢先來(lái)總結(jié)一下效果類似與跑馬燈效果,閃動(dòng)效果先快后慢。 總是看到類似的九宮格抽獎(jiǎng)效果,后來(lái)想自己手?jǐn)]一個(gè)試一試吧。(多多嘗試,萬(wàn)一成功了呢 github L6zt) 先來(lái)總結(jié)一下效果,類似與跑馬燈效果,閃動(dòng)效果先快后慢。代碼解析如下所示:代碼 0 ...

    ChanceWong 評(píng)論0 收藏0
  • 手?jǐn)]一個(gè)JS深拷貝函數(shù)

    摘要:深拷貝概念并不新鮮,但是真正要真正理解原理還是有點(diǎn)難度的。這也是語(yǔ)言精粹之一吧。 JS深拷貝概念并不新鮮,但是真正要真正理解原理還是有點(diǎn)難度的。這也是JS語(yǔ)言精粹之一吧。 例子 let a = { name: demo, age: 18 }; let b = a; b.name = demo1; console.log(a); // 輸出 {name: demo1,...

    EscapedDog 評(píng)論0 收藏0
  • 滾動(dòng)加載插件.手?jǐn)]實(shí)戰(zhàn)

    摘要:滾動(dòng)插件設(shè)計(jì)原理獲取滾動(dòng)元素的視口高度和滾動(dòng)高度得出滾動(dòng)軸最大滾動(dòng)距離根據(jù)滾動(dòng)時(shí)計(jì)算滾動(dòng)時(shí)滾動(dòng)軸的滾動(dòng)高度與比較做差,判斷是否觸發(fā)動(dòng)作。 // github L6zt滾動(dòng)插件設(shè)計(jì)原理 獲取滾動(dòng)元素的視口高度viewH和滾動(dòng)高度scrollH,得出 滾動(dòng)軸最大滾動(dòng)距離 scrollMaxTop = viewH - scrollH; 根據(jù)滾動(dòng)時(shí)計(jì)算滾動(dòng)時(shí)滾動(dòng)軸的滾動(dòng)高度 scrollTo...

    Meils 評(píng)論0 收藏0
  • 滾動(dòng)加載插件.手?jǐn)]實(shí)戰(zhàn)

    摘要:滾動(dòng)插件設(shè)計(jì)原理獲取滾動(dòng)元素的視口高度和滾動(dòng)高度得出滾動(dòng)軸最大滾動(dòng)距離根據(jù)滾動(dòng)時(shí)計(jì)算滾動(dòng)時(shí)滾動(dòng)軸的滾動(dòng)高度與比較做差,判斷是否觸發(fā)動(dòng)作。 // github L6zt滾動(dòng)插件設(shè)計(jì)原理 獲取滾動(dòng)元素的視口高度viewH和滾動(dòng)高度scrollH,得出 滾動(dòng)軸最大滾動(dòng)距離 scrollMaxTop = viewH - scrollH; 根據(jù)滾動(dòng)時(shí)計(jì)算滾動(dòng)時(shí)滾動(dòng)軸的滾動(dòng)高度 scrollTo...

    wanglu1209 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<