日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

好用到爆的 Java 小技巧

發布時間:2025/3/20 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 好用到爆的 Java 小技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方?好好學java?,選擇?星標?公眾號

重磅資訊、干貨,第一時間送達 今日推薦:SQL 語法速成手冊文末點擊閱讀原文,去B站看視頻,別忘記關注哦 個人原創100W+訪問量博客:點擊前往,查看更多

來自:Lrwin 的技術博客

http://lrwinx.github.io/2017/03/04

本文不是一個吹噓的文章,不會講很多高深的架構,相反,會講解很多基礎的問題和寫法問題,如果讀者自認為基礎問題和寫法問題都是不是問題,那請忽略這篇文章,節省出時間去做一些有意義的事情。

開發工具

不知道有多少 “老” 程序員還在使用 Eclipse,這些程序員們要不就是因循守舊,要不就是根本就不知道其他好的開發工具的存在,Eclipse 吃內存卡頓的現象,以及各種偶然莫名異常的出現,都告知我們是時候尋找新的開發工具了。

更換 IDE

根本就不想多解釋要換什么樣的 IDE,如果你想成為一個優秀的 Java 程序員,請更換 IntelliJ IDEA。使用 IDEA 的好處,請搜索谷歌。

別告訴我快捷鍵不好用

更換 IDE 不在我本文的重點內容中,所以不想用太多的篇幅去寫為什么更換 IDE。在這里,我只能告訴你,更換 IDE 只為了更好、更快的寫好 Java 代碼。原因略。

別告訴我快捷鍵不好用,請嘗試新事物。

Bean

Bean 使我們使用最多的模型之一,我將以大篇幅去講解 Bean,希望讀者好好體會。

Domain 包名

根據很多 Java 程序員的” 經驗” 來看,一個數據庫表則對應著一個 Domain 對象,所以很多程序員在寫代碼時,包名則使用:com.xxx.domain ,這樣寫好像已經成為了行業的一種約束,數據庫映射對象就應該是 Domain。但是你錯了,Domain 是一個領域對象,往往我們再做傳統 Java 軟件 Web 開發中,這些 Domain 都是貧血模型,是沒有行為的,或是沒有足夠的領域模型的行為的,所以,以這個理論來講,這些 Domain 都應該是一個普通的 entity 對象,并非領域對象,所以請把包名改為: com.xxx.entity。

如果你還不理解我說的話,請看一下 Vaughn Vernon 出的一本叫做?IMPLEMENTING DOMAIN-DRIVEN DESIGN(《實現領域驅動設計》)這本書,書中講解了貧血模型與領域模型的區別,相信你會受益匪淺。

DTO

數據傳輸我們應該使用 DTO 對象作為傳輸對象,這是我們所約定的,因為很長時間我一直都在做移動端 API 設計的工作,有很多人告訴我,他們認為只有給手機端傳輸數據的時候(input or output),這些對象成為 DTO 對象。請注意!這種理解是錯誤的,只要是用于網絡傳輸的對象,我們都認為他們可以當做是 DTO 對象,比如電商平臺中,用戶進行下單,下單后的數據,訂單會發到 OMS 或者 ERP 系統,這些對接的返回值以及入參也叫 DTO 對象。

我們約定某對象如果是 DTO 對象,就將名稱改為 XXDTO,比如訂單下發 OMS:OMSOrderInputDTO。

附上我歷時三個月總結的?Java 面試 + Java 后端技術學習指南,筆者這幾年及春招的總結,github 1.4k star,拿去不謝!

下載方式

1.?首先掃描下方二維碼

2.?后臺回復「Java面試」即可獲取

DTO 轉化

正如我們所知,DTO 為系統與外界交互的模型對象,那么肯定會有一個步驟是將 DTO 對象轉化為 BO 對象或者是普通的 entity 對象,讓 service 層去處理。搜索公縱號:MarkerHub,關注回復[?vue?]獲取前后端入門教程!

場景

比如添加會員操作,由于用于演示,我只考慮用戶的一些簡單數據,當后臺管理員點擊添加用戶時,只需要傳過來用戶的姓名和年齡就可以了,后端接受到數據后,將添加創建時間和更新時間和默認密碼三個字段,然后保存數據庫。

@RestController public?class?UserApi?{@Autowiredprivate?UserService userService;@PostMappingpublic?User addUser(UserInputDTO userInputDTO){User user = new?User();user.setUsername(userInputDTO.getUsername());user.setAge(userInputDTO.getAge());return?userService.addUser(user);} }

我們只關注一下上述代碼中的轉化代碼,其他內容請忽略:

User user = new?User(); user.setUsername(userInputDTO.getUsername()); user.setAge(userInputDTO.getAge());

請使用工具

上邊的代碼,從邏輯上講,是沒有問題的,只是這種寫法讓我很厭煩,例子中只有兩個字段,如果有 20 個字段,我們要如何做呢?一個一個進行 set 數據嗎?當然,如果你這么做了,肯定不會有什么問題,但是,這肯定不是一個最優的做法。

網上有很多工具,支持淺拷貝或深拷貝的 Utils。舉個例子,我們可以使用 org.springframework.beans.BeanUtils#copyProperties 對代碼進行重構和優化:

@PostMapping public?User addUser(UserInputDTO userInputDTO){User user = new?User();BeanUtils.copyProperties(userInputDTO,user);return?userService.addUser(user); }

BeanUtils.copyProperties 是一個淺拷貝方法,復制屬性時,我們只需要把 DTO 對象和要轉化的對象兩個的屬性值設置為一樣的名稱,并且保證一樣的類型就可以了。如果你在做 DTO 轉化的時候一直使用 set 進行屬性賦值,那么請嘗試這種方式簡化代碼,讓代碼更加清晰!

轉化的語義

上邊的轉化過程,讀者看后肯定覺得優雅很多,但是我們再寫 Java 代碼時,更多的需要考慮語義的操作,再看上邊的代碼:

User user = new?User(); BeanUtils.copyProperties(userInputDTO,user);

雖然這段代碼很好地簡化和優化了代碼,但是它的語義是有問題的,我們需要提現一個轉化過程才好,所以代碼改成如下:

@PostMappingpublic?User addUser(UserInputDTO userInputDTO){User user = convertFor(userInputDTO);return?userService.addUser(user);}private?User convertFor(UserInputDTO userInputDTO){User user = new?User();BeanUtils.copyProperties(userInputDTO,user);return?user;}

這是一個更好的語義寫法,雖然麻煩了些,但是可讀性大大增加了,在寫代碼時,我們應該盡量把語義層次差不多地放到一個方法中,比如:

User?user = convertFor(userInputDTO); return?userService.addUser(user);

這兩段代碼都沒有暴露實現,都是在講如何在同一個方法中,做一組相同層次的語義操作,而不是暴露具體的實現。

如上所述,是一種重構方式,讀者可以參考?Martin Fowler 的 Refactoring Imporving the Design of Existing Code(《重構——改善既有代碼的設計》)這本書中的 Extract Method 重構方式。

抽象接口定義

當實際工作中,完成了幾個 API 的 DTO 轉化時,我們會發現,這樣的操作有很多很多,那么應該定義好一個接口,讓所有這樣的操作都有規則的進行。

如果接口被定義以后,那么 convertFor 這個方法的語義將產生變化,它將是一個實現類。

看一下抽象后的接口:

public?interface?DTOConvert<S,T> {T convert(S s); }

雖然這個接口很簡單,但是這里告訴我們一個事情,要去使用泛型,如果你是一個優秀的 Java 程序員,請為你想做的抽象接口,做好泛型吧。

我們再來看接口實現:

public?class?UserInputDTOConvert?implements?DTOConvert?{ @Override public?User convert(UserInputDTO userInputDTO)?{ User user = new?User(); BeanUtils.copyProperties(userInputDTO,user); return?user; } }

我們這樣重構后,我們發現現在的代碼是如此的簡潔,并且那么的規范:

@RequestMapping("/v1/api/user") @RestController public?class?UserApi?{@Autowiredprivate?UserService userService;@PostMappingpublic?User addUser(UserInputDTO userInputDTO){User user = new?UserInputDTOConvert().convert(userInputDTO);return?userService.addUser(user);} }

Review Code

如果你是一個優秀的 Java 程序員,我相信你應該和我一樣,已經數次重復 Review 過自己的代碼很多次了。

我們再看這個保存用戶的例子,你將發現,API 中返回值是有些問題的,問題就在于不應該直接返回 User 實體,因為如果這樣的話,就暴露了太多實體相關的信息,這樣的返回值是不安全的,所以我們更應該返回一個 DTO 對象,我們可稱它為 UserOutputDTO:

@PostMapping public?UserOutputDTO addUser(UserInputDTO userInputDTO){User user = new?UserInputDTOConvert().convert(userInputDTO);User saveUserResult = userService.addUser(user);UserOutputDTO result = new?UserOutDTOConvert().convertToUser(saveUserResult);return?result; }

這樣你的 API 才更健全。

不知道在看完這段代碼之后,讀者有是否發現還有其他問題的存在,作為一個優秀的 Java 程序員,請看一下這段我們剛剛抽象完的代碼:

User user = new?UserInputDTOConvert().convert(userInputDTO);

你會發現,new 這樣一個 DTO 轉化對象是沒有必要的,而且每一個轉化對象都是由在遇到 DTO 轉化的時候才會出現,那我們應該考慮一下,是否可以將這個類和 DTO 進行聚合呢,看一下我的聚合結果:

public?class?UserInputDTO?{ private?String username; private?int?age;public?String getUsername()?{return?username;}public?void?setUsername(String username)?{this.username = username;}public?int?getAge()?{return?age;}public?void?setAge(int?age)?{this.age = age;}public?User convertToUser(){UserInputDTOConvert userInputDTOConvert = new?UserInputDTOConvert();User convert = userInputDTOConvert.convert(this);return?convert;}private?static?class?UserInputDTOConvert?implements?DTOConvert<UserInputDTO,User> {@Overridepublic?User convert(UserInputDTO userInputDTO)?{User user = new?User();BeanUtils.copyProperties(userInputDTO,user);return?user;}} }

然后 API 中的轉化則由:

User user = new?UserInputDTOConvert().convert(userInputDTO); User saveUserResult = userService.addUser(user);

變成了:

User user = userInputDTO.convertToUser(); User saveUserResult = userService.addUser(user);

我們再 DTO 對象中添加了轉化的行為,我相信這樣的操作可以讓代碼的可讀性變得更強,并且是符合語義的。

再查工具類

再來看 DTO 內部轉化的代碼,它實現了我們自己定義的 DTOConvert 接口,但是這樣真的就沒有問題,不需要再思考了嗎?

搜索公縱號:MarkerHub,關注回復[?vue?]獲取前后端入門教程!

我覺得并不是,對于 Convert 這種轉化語義來講,很多工具類中都有這樣的定義,這中 Convert 并不是業務級別上的接口定義,它只是用于普通 bean 之間轉化屬性值的普通意義上的接口定義,所以我們應該更多的去讀其他含有 Convert 轉化語義的代碼。

我仔細閱讀了一下 GUAVA 的源碼,發現了 com.google.common.base.Convert 這樣的定義:

public?abstract?class?Converter<A, B> implements?Function<A, B> {protected?abstract?B doForward(A a);protected?abstract?A doBackward(B b);//其他略 }

從源碼可以了解到,GUAVA 中的 Convert 可以完成正向轉化和逆向轉化,繼續修改我們 DTO 中轉化的這段代碼:

private?static?class?UserInputDTOConvert?implements?DTOConvert<UserInputDTO,User> {@Overridepublic?User convert(UserInputDTO userInputDTO)?{User user = new?User();BeanUtils.copyProperties(userInputDTO,user);return?user;} }

修改后:

private?static?class?UserInputDTOConvert?extends?Converter<UserInputDTO, User> {@Overrideprotected?User doForward(UserInputDTO userInputDTO)?{User user = new?User();BeanUtils.copyProperties(userInputDTO,user);return?user;}@Overrideprotected?UserInputDTO doBackward(User user)?{UserInputDTO userInputDTO = new?UserInputDTO();BeanUtils.copyProperties(user,userInputDTO);return?userInputDTO;}}

看了這部分代碼以后,你可能會問,那逆向轉化會有什么用呢?其實我們有很多小的業務需求中,入參和出參是一樣的,那么我們變可以輕松的進行轉化,我將上邊所提到的 UserInputDTO 和 UserOutputDTO 都轉成 UserDTO 展示給大家。

DTO:

public?class?UserDTO?{private?String username;private?int?age;public?String getUsername()?{return?username;}public?void?setUsername(String username)?{this.username = username;}public?int?getAge()?{return?age;}public?void?setAge(int?age)?{this.age = 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<UserDTO, User> {@Overrideprotected?User doForward(UserDTO userDTO)?{User user = new?User();BeanUtils.copyProperties(userDTO,user);return?user;}@Overrideprotected?UserDTO doBackward(User user)?{UserDTO userDTO = new?UserDTO();BeanUtils.copyProperties(user,userDTO);return?userDTO;}} }

API:

@PostMappingpublic?UserDTO addUser(UserDTO userDTO){User user = userDTO.convertToUser();User saveResultUser = userService.addUser(user);UserDTO result = userDTO.convertFor(saveResultUser);return?result;}

當然,上述只是表明了轉化方向的正向或逆向,很多業務需求的出參和入參的 DTO 對象是不同的,那么你需要更明顯地告訴程序:逆向是無法調用的。

private?static?class?UserDTOConvert?extends?Converter<UserDTO, User> {@Overrideprotected?User doForward(UserDTO userDTO)?{User user = new?User();BeanUtils.copyProperties(userDTO,user);return?user;}@Overrideprotected?UserDTO doBackward(User user)?{throw?new?AssertionError("不支持逆向轉化方法!");}}

看一下 doBackward 方法,直接拋出了一個斷言異常,而不是業務異常,這段代碼告訴代碼的調用者,這個方法不是準你調用的,如果你調用,我就 “斷言” 你調用錯誤了。

關于異常處理的更詳細介紹,可以參考這篇文章:《如何優雅地設計 Java 異?!?#xff0c;應該可以幫你更好地理解異常。

Bean 的驗證

如果你認為我上邊寫的那個添加用戶 API 寫的已經非常完美了,那只能說明你還不是一個優秀的程序員。我們應該保證任何數據的入參到方法體內都是合法的。

為什么要驗證

很多人會告訴我,如果這些 API 是提供給前端進行調用的,前端都會進行驗證啊,你為什還要驗證?

其實答案是這樣的,我從不相信任何調用我 API 或者方法的人,比如前端驗證失敗了,或者某些人通過一些特殊的渠道(比如 Charles 進行抓包),直接將數據傳入到我的 API,那我仍然進行正常的業務邏輯處理,那么就有可能產生臟數據!

“對于臟數據的產生一定是致命”,這句話希望大家牢記在心,再小的臟數據也有可能讓你找幾個通宵!

JSR 303 驗證

Hibernate 提供的 JSR 303 實現,我覺得目前仍然是很優秀的,具體如何使用,我不想講,因為谷歌上你可以搜索出很多答案!

再以上班的 API 實例進行說明,我們現在對 DTO 數據進行檢查:

public?class?UserDTO?{@NotNullprivate?String username;@NotNullprivate?int?age;//其他代碼略 }

API 驗證:

@PostMappingpublic?UserDTO addUser(@Valid?UserDTO userDTO){User user = userDTO.convertToUser();User saveResultUser = userService.addUser(user);UserDTO result = userDTO.convertFor(saveResultUser);return?result;}

我們需要將驗證結果傳給前端,這種異常應該轉化為一個 API 異常(帶有錯誤碼的異常)。

@PostMapping public?UserDTO addUser(@Valid UserDTO userDTO, BindingResult bindingResult){checkDTOParams(bindingResult);User user = userDTO.convertToUser();User saveResultUser = userService.addUser(user);UserDTO result = userDTO.convertFor(saveResultUser);return?result; } private?void?checkDTOParams(BindingResult bindingResult){if(bindingResult.hasErrors()){//throw new 帶驗證碼的驗證錯誤異常} }

BindingResult 是 Spring MVC 驗證 DTO 后的一個結果集,可以參考 Spring 官方文檔(spring.io/)。

檢查參數后,可以拋出一個 “帶驗證碼的驗證錯誤異?!?。

上邊的 DTO 代碼,已經讓我看的很累了,我相信讀者也是一樣,看到那么多的 Getter 和 Setter 方法,太煩躁了,那時候有什么方法可以簡化這些呢。

請擁抱 Lombok,它會幫助我們解決一些讓我們很煩躁的問題。

去掉 Setter 和 Getter

其實這個標題,我不太想說,因為網上太多,但是因為很多人告訴我,他們根本就不知道 Lombok 的存在,所以為了讓讀者更好的學習,我愿意寫這樣一個例子:

@Setter @Getter public?class?UserDTO?{@NotNullprivate?String username;@NotNullprivate?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<UserDTO, User> {@Overrideprotected?User doForward(UserDTO userDTO)?{User user = new?User();BeanUtils.copyProperties(userDTO,user);return?user;}@Overrideprotected?UserDTO doBackward(User user)?{throw?new?AssertionError("不支持逆向轉化方法!");}} }

看到了吧,煩人的 Getter 和 Setter 方法已經去掉了。

但是上邊的例子根本不足以體現 lombok 的強大。我希望寫一些網上很難查到,或者很少人進行說明的 lombok 的使用以及在使用時程序語義上的說明。

比如:@Data,@AllArgsConstructor,@NoArgsConstructor.. 這些我就不進行一一說明了,請大家自行查詢資料。

Bean 中的鏈式風格

什么是鏈式風格?我來舉個例子,看下面這個 Student 的 Bean:

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;} }

仔細看一下 set 方法,這樣的設置便是 chain 的 style,調用的時候,可以這樣使用:

Student student = new?Student().setAge(24).setName("zs");

相信合理使用這樣的鏈式代碼,會更多的程序帶來很好的可讀性,那看一下如果使用 Lombok 進行改善呢,請使用?@Accessors(chain = true),看如下代碼:

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

這樣就完成了一個對于 Bean 來講很友好的鏈式操作。

靜態構造方法

靜態構造方法的語義和簡化程度真的高于直接去 new 一個對象。比如 new 一個 List 對象,過去的使用是這樣的:

List<String> list?= new?ArrayList<>();

看一下 Guava 中的創建方式:

List<String> list?= Lists.newArrayList();

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

HashMap<String, String> objectObjectHashMap = Maps.newHashMap();

好了,如果你理解了我說的語義,那么,你已經向成為 Java 程序員更近了一步了。

再回過頭來看剛剛的 Student,很多時候,我們去寫 Student 這個 bean 的時候,他會有一些必輸字段,比如 Student 中的 name 字段,一般處理的方式是將 name 字段包裝成一個構造方法,只有傳入 name 這樣的構造方法,才能創建一個 Student 對象。

接上上邊的靜態構造方法和必傳參數的構造方法,使用 Lombok 將更改成如下寫法(@RequiredArgsConstructor 和 @NonNull):

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

測試代碼:

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

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

當然,看過很多源碼以后,我想相信將靜態構造方法 ofName 換成 of 會先的更加簡潔:

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

測試代碼:

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

當然它仍然是支持鏈式調用的:

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

這樣來寫代碼,真的很簡潔,并且可讀性很強。

使用 Builder

Builder 模式我不想再多解釋了,讀者可以看一下 Head First(《設計模式》)的建造者模式。

今天其實要說的是一種變種的 Builder 模式,那就是構建 Bean 的 Builder 模式,其實主要的思想是帶著大家一起看一下 Lombok 給我們帶來了什么。

看一下 Student 這個類的原始 Builder 狀態:

public?class?Student?{private?String name;private?int?age;public?String getName()?{return?name;}public?void?setName(String name)?{this.name = name;}public?int?getAge()?{return?age;}public?void?setAge(int?age)?{this.age = age;}public?static?Builder builder(){return?new?Builder();}public?static?class?Builder{private?String name;private?int?age;public?Builder name(String name){this.name = name;return?this;}public?Builder age(int?age){this.age = age;return?this;}public?Student build(){Student student = new?Student();student.setAge(age);student.setName(name);return?student;}} }

調用方式:

Student?student = Student.builder().name("zs").age(24).build();

這樣的 Builder 代碼,讓我是在惡心難受,于是我打算用 Lombok 重構這段代碼:

@Builder public?class?Student?{private?String name;private?int?age; }

調用方式:

Student?student = Student.builder().name("zs").age(24).build();

代理模式

正如我們所知的,在程序中調用 Rest 接口是一個常見的行為動作,如果你和我一樣使用過 Spring 的 RestTemplate,我相信你會我和一樣,對它拋出的非 HTTP 狀態碼異常深惡痛絕。

所以我們考慮將 RestTemplate 最為底層包裝器進行包裝器模式的設計:

public?abstract?class?FilterRestTemplate?implements?RestOperations?{protected?volatile?RestTemplate restTemplate;protected?FilterRestTemplate(RestTemplate restTemplate){this.restTemplate = restTemplate;}//實現RestOperations所有的接口 }

然后再由擴展類對 FilterRestTemplate 進行包裝擴展:

public?class?ExtractRestTemplate?extends?FilterRestTemplate?{private?RestTemplate restTemplate;public?ExtractRestTemplate(RestTemplate restTemplate)?{super(restTemplate);this.restTemplate = restTemplate;}public?<T> RestResponseDTO<T> postForEntityWithNoException(String url, Object request, Class<T> responseType, Object... uriVariables)throws?RestClientException {RestResponseDTO<T> restResponseDTO = new?RestResponseDTO<T>();ResponseEntity<T> 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 很完美的更改了異常拋出的行為,讓程序更具有容錯性。在這里我們不考慮 ExtractRestTemplate 完成的功能,讓我們把焦點放在 FilterRestTemplate 上,“實現 RestOperations 所有的接口”,這個操作絕對不是一時半會可以寫完的,當時在重構之前我幾乎寫了半個小時,如下:

public?abstract?class?FilterRestTemplate?implements?RestOperations?{protected?volatile?RestTemplate restTemplate;protected?FilterRestTemplate(RestTemplate restTemplate)?{this.restTemplate = restTemplate;}@Overridepublic?<T> T getForObject(String url, Class<T> responseType, Object... uriVariables)?throws?RestClientException {return?restTemplate.getForObject(url,responseType,uriVariables);}@Overridepublic?<T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)?throws?RestClientException {return?restTemplate.getForObject(url,responseType,uriVariables);}@Overridepublic?<T> T getForObject(URI url, Class<T> responseType)?throws?RestClientException {return?restTemplate.getForObject(url,responseType);}@Overridepublic?<T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)?throws?RestClientException {return?restTemplate.getForEntity(url,responseType,uriVariables);}//其他實現代碼略。。。 }

我相信你看了以上代碼,你會和我一樣覺得惡心反胃,后來我用 Lombok 提供的代理注解優化了我的代碼(@Delegate):

@AllArgsConstructor public?abstract?class?FilterRestTemplate?implements?RestOperations?{@Delegateprotected?volatile?RestTemplate restTemplate; }

這幾行代碼完全替代上述那些冗長的代碼。

搜索公縱號:MarkerHub,關注回復[?vue?]獲取前后端入門教程!

是不是很簡潔,做一個擁抱 Lombok 的程序員吧。

重構:需求案例

項目需求

項目開發階段,有一個關于下單發貨的需求:

如果今天下午 3 點前進行下單,那么發貨時間是明天,如果今天下午 3 點后進行下單,那么發貨時間是后天,如果被確定的時間是周日,那么在此時間上再加 1 天為發貨時間。

思考與重構

我相信這個需求看似很簡單,無論怎么寫都可以完成。

很多人可能看到這個需求,就動手開始寫 Calendar 或 Date 進行計算,從而完成需求。

而我給的建議是,仔細考慮如何寫代碼,然后再去寫,不是說所有的時間操作都用 Calendar 或 Date 去解決,一定要看場景。

對于時間的計算我們要考慮 joda-time 這種類似的成熟時間計算框架來寫代碼,它會讓代碼更加簡潔和易讀。

請讀者先考慮這個需求如何用 Java 代碼完成,或先寫一個你覺得完成這個代碼的思路,再來看我下邊的代碼,這樣,你的收獲會更多一些:

final DateTime DISTRIBUTION_TIME_SPLIT_TIME = new?DateTime().withTime(15,0,0,0); private?Date?calculateDistributionTimeByOrderCreateTime(Date?orderCreateTime){DateTime orderCreateDateTime = new?DateTime(orderCreateTime);Date?tomorrow = orderCreateDateTime.plusDays(1).toDate();Date?theDayAfterTomorrow = orderCreateDateTime.plusDays(2).toDate();return?orderCreateDateTime.isAfter(DISTRIBUTION_TIME_SPLIT_TIME) ? wrapDistributionTime(theDayAfterTomorrow) : wrapDistributionTime(tomorrow); } private?Date?wrapDistributionTime(Date?distributionTime){DateTime currentDistributionDateTime = new?DateTime(distributionTime);DateTime plusOneDay = currentDistributionDateTime.plusDays(1);boolean?isSunday = (DateTimeConstants.SUNDAY == currentDistributionDateTime.getDayOfWeek());return?isSunday ? plusOneDay.toDate() : currentDistributionDateTime.toDate() ; }

讀這段代碼的時候,你會發現,我將判斷和有可能出現的不同結果都當做一個變量,最終做一個三目運算符的方式進行返回,這樣的優雅和可讀性顯而易見,當然這樣的代碼不是一蹴而就的,我優化了 3 遍產生的以上代碼。讀者可根據自己的代碼和我寫的代碼進行對比。

提高方法

如果你做了 3 年 + 的程序員,我相信像如上這樣的需求,你很輕松就能完成,但是如果你想做一個會寫 Java 的程序員,就好好的思考和重構代碼吧。

寫代碼就如同寫字一樣,同樣的字,大家都會寫,但是寫出來是否好看就不一定了。如果想把程序寫好,就要不斷地思考和重構,敢于嘗試,敢于創新,不要因循守舊,一定要做一個優秀的 Java 程序員。

提高代碼水平最好的方法就是有條理的重構!(注意:是有條理的重構)

設計模式

設計模式就是工具,而不是提現你是否是高水平程序員的一個指標。

我經常會看到某一個程序員興奮的大喊,哪個程序哪個點我用到了設計模式,寫的多么多么優秀,多么多么好。我仔細去翻閱的時候,卻發現有很多是過度設計的。

業務驅動技術 or 技術驅動業務

業務驅動技術 or 技術驅動業務 ?其實這是一個一直在爭論的話題,但是很多人不這么認為,我覺得就是大家不愿意承認罷了。我來和大家大概分析一下作為一個 Java 程序員,我們應該如何判斷自己所處于的位置。

  • 業務驅動技術:?如果你所在的項目是一個收益很小或者甚至沒有收益的項目,請不要搞其他創新的東西,不要驅動業務要如何如何做,而是要熟知業務現在的痛點是什么?如何才能幫助業務盈利或者讓項目更好,更順利的進行。

  • 技術驅動業務:?如果你所在的項目是一個很牛的項目,比如淘寶這類的項目,我可以在滿足業務需求的情況下,和業務溝通,使用什么樣的技術能更好的幫助業務創造收益,比如說下單的時候要進隊列,可能幾分鐘之后訂單狀態才能處理完成,但是會讓用戶有更流暢的體驗,賺取更多的訪問流量,那么我相信業務愿意被技術驅動,會同意訂單的延遲問題,這樣便是技術驅動業務。

我相信大部分人還都處于業務驅動技術的方向吧。

所以你既然不能驅動業務,那就請擁抱業務變化吧。

代碼設計

一直在做 Java 后端的項目,經常會有一些變動,我相信大家也都遇到過。

比如當我們寫一段代碼的時候,我們考慮將需求映射成代碼的狀態模式,突然有一天,狀態模式里邊又添加了很多行為變化的東西,這時候你就撓頭了,你硬生生的將狀態模式中添加過多行為和變化。

慢慢地你會發現這些狀態模式,其實更像是一簇算法,應該使用策略模式,這時你應該已經暈頭轉向了。

說了這么多,我的意思是,只要你覺得合理,就請將狀態模式改為策略模式吧,所有的模式并不是憑空想象出來的,都是基于重構。

Java 編程中沒有銀彈,請擁抱業務變化,一直思考重構,你就有一個更好的代碼設計!

你真的優秀嗎?

真不好意思,我取了一個這么無聊的標題。

國外流行一種編程方式,叫做結對編程,我相信國內很多公司都沒有這么做,我就不在講述結對編程帶來的好處了,其實就是一邊 Code Review,一邊互相提高的一個過程。既然做不到這個,那如何讓自己活在自己的世界中不斷提高呢?

“平時開發的時候,做出的代碼總認為是正確的,而且寫法是完美的?!?我相信這是大部分人的心聲,還回到剛剛的問題,如何在自己的世界中不斷提高呢?

答案就是:

  • 多看成熟框架的源碼

  • 多回頭看自己的代碼

  • 勤于重構

  • 你真的優秀嗎?如果你每周都完成了學習源碼,回頭看自己代碼,然后勤于重構,我認為你就真的很優秀了。

    即使也許你只是剛剛入門,但是一直堅持,你就是一個真的會寫 java 代碼的程序員了。

    技能

    UML

    不想多討論 UML 相關的知識,但是我覺得你如果真的會寫 Java,請先學會表達自己,UML 就是你說話的語言,做一名優秀的 Java 程序員,請至少學會這兩種 UML 圖:

  • 類圖

  • 時序圖

  • Clean Code

    我認為保持代碼的簡潔和可讀性是代碼的最基本保證,如果有一天為了程序的效率而降低了這兩點,我認為是可以諒解的,除此之外,沒有任何理由可以讓你任意揮霍你的代碼。

  • 讀者可以看一下 Robert C. Martin 出版的?Clean Code(《代碼整潔之道》) 這本書

  • 可以參考美團文章:《聊聊 Clean Code》

  • 也可以看一下阿里的 Java 編碼規范

  • 無論如何,請保持你的代碼的整潔。

    Linux 基礎命令

    這點其實和會寫 Java 沒有關系,但是 Linux 很多時候確實承載運行 Java 的容器,請學好 Linux 的基礎命令。

    總結

    Java 是一個大體系,今天討論并未涉及框架和架構相關知識,只是討論如何寫好代碼。

    本文從寫 Java 程序的小方面一直寫到大方面,來闡述了如何才能寫 m/mazi 好 Java 程序,并告訴讀者們如何才能提高自身的編碼水平。我希望看到這篇文章的各位都能做一個優秀的 Java 程序員。

    最后,再附上我歷時三個月總結的?Java 面試 + Java 后端技術學習指南,筆者這幾年及春招的總結,github 1.4k star,拿去不謝!

    下載方式

    1.?首先掃描下方二維碼

    2.?后臺回復「Java面試」即可獲取

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的好用到爆的 Java 小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品视频你懂的 | 亚洲电影院 | 亚洲mv大片欧洲mv大片免费 | 超碰在线公开免费 | 亚洲综合黄色 | 国产高清不卡一区二区三区 | 91视频午夜| 亚洲精品在线一区二区三区 | 国产精品免费观看视频 | 亚洲男人天堂2018 | 久久草视频| 日韩有码中文字幕在线 | 亚洲一级片在线观看 | x99av成人免费 | 在线视频99 | 美女网站视频色 | 亚洲高清色综合 | 精品国产乱码久久久久久1区二区 | 伊人婷婷 | 亚洲午夜久久久久久久久久久 | 欧美一区二区日韩一区二区 | 99福利片 | 久久久www成人免费精品张筱雨 | 国产原创91 | 人人爽人人爽人人片 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产亚洲视频在线免费观看 | 在线观看91av | 日韩理论| 亚洲情感电影大片 | 一区二区三区在线免费播放 | 成人av在线播放网站 | 国产区精品区 | 日韩三级视频在线观看 | 免费观看的黄色 | 亚洲精品视频第一页 | 免费在线看成人av | 91亚洲精品久久久蜜桃网站 | 日韩在线观看一区二区 | 国产最新视频在线 | 人成免费网站 | 激情婷婷av | 精品毛片久久久久久 | 色综合天天射 | 麻豆免费在线视频 | 久久精品一区二区国产 | 亚洲国产午夜精品 | 日本三级久久 | av电影av在线 | 在线免费观看的av | 狠狠干天天干 | 探花视频在线版播放免费观看 | av成人黄色| 天天草天天摸 | 久久久久久久久影视 | 亚洲成人免费 | 日日干综合 | 国产高清黄 | 国产最新在线 | 亚洲综合丁香 | 日韩精品第1页 | 成人毛片在线观看 | 免费黄色在线播放 | 爱射综合 | 美女网站黄免费 | 欧美性爽爽 | www.亚洲精品在线 | 一级理论片在线观看 | 日日碰狠狠添天天爽超碰97久久 | 天天干天天天 | 欧美高清视频不卡网 | 热re99久久精品国产66热 | 超级碰碰视频 | 97在线观看视频 | 午夜av电影院 | 激情视频久久 | 天天干天天草天天爽 | 欧美一区二区三区免费观看 | 日韩久久久久久久久 | 一区 二区电影免费在线观看 | 黄色www在线观看 | 午夜av免费观看 | 久久精品亚洲国产 | 久草在线视频首页 | 一级成人免费 | 欧美精彩视频在线观看 | 日日麻批40分钟视频免费观看 | 精品免费久久 | 国产一级淫片在线观看 | www.com.日本一级 | 亚洲三级在线免费观看 | 天天操夜夜看 | 最近中文字幕视频网 | 97天天综合网| 成人av电影免费在线播放 | 天天翘av | 欧美日韩精品免费观看视频 | 五月天激情视频在线观看 | 日韩欧美电影在线观看 | 久久99电影| 亚洲精品国产品国语在线 | 亚洲理论电影 | 免费午夜网站 | 一区二区视频在线观看免费 | 久久五月精品 | 国产成人精品亚洲日本在线观看 | 日韩中文字幕在线观看 | 欧美性性网 | 中文字幕专区高清在线观看 | 在线有码中文字幕 | 久久精品国产精品亚洲精品 | 亚洲免费观看在线视频 | 天堂网一区二区三区 | 天天碰天天操视频 | 国产一区二区网址 | 超碰在线观看av.com | 婷婷九月激情 | 97超碰超碰 | 黄色录像av | 中文字幕亚洲欧美日韩2019 | 亚洲国产精品视频在线观看 | 国产精品免费看 | 久久综合久色欧美综合狠狠 | 午夜在线观看一区 | 在线免费高清一区二区三区 | 国产九九精品视频 | 黄色av免费 | 国产精品 日韩 | 国产精品18久久久久久久 | 亚洲视频1 | 久久精品99国产国产 | 国产在线1区 | 国产色爽 | 99久久国产免费,99久久国产免费大片 | 9797在线看片亚洲精品 | 亚洲一二三久久 | 麻豆视频免费观看 | 成人黄色小说视频 | 亚洲成人黄色av | 久热香蕉视频 | 91免费看片黄 | 麻花豆传媒一二三产区 | 三三级黄色片之日韩 | 精品福利av | 久久综合网色—综合色88 | 97色涩 | 久久久午夜剧场 | 久热免费在线观看 | 久久人人艹 | 欧美在线观看视频一区二区 | 九九亚洲精品 | 中文av字幕在线观看 | 亚洲精品久久久蜜臀下载官网 | 久久精品第一页 | 成人黄色电影在线观看 | 高潮毛片无遮挡高清免费 | av在线播放免费 | 欧美国产91 | 天天天色综合 | 欧美精品一区二区在线播放 | 国产又粗又长的视频 | 一本之道乱码区 | 日韩久久久久 | 成人动漫一区二区三区 | 人人澡人人添人人爽一区二区 | 狠狠狠狠狠狠狠狠干 | 国产又粗又猛又黄又爽的视频 | 日韩视频免费在线 | 久久精品伊人 | 国产欧美在线一区二区三区 | 国产成人在线播放 | 91麻豆操 | 欧美国产日韩一区二区三区 | 国产最新91 | 国产成人精品亚洲a | 中文字幕在线视频国产 | 国产精品婷婷午夜在线观看 | 午夜久草 | 亚洲精品视频中文字幕 | 亚洲国产成人精品久久 | 国内视频在线观看 | 黄色软件视频大全免费下载 | 久久久久久久久久久黄色 | 韩国av电影在线观看 | av在线直接看 | 国产成人精品999 | 久久理论电影 | 日韩影视精品 | 91看片麻豆 | 人人爽久久涩噜噜噜网站 | 久久久精品高清 | 亚洲精品www久久久 www国产精品com | 国产剧情一区二区在线观看 | 日韩极品在线 | 国产一级一级国产 | 免费观看av | 日韩精品久久久久 | 911香蕉视频 | 久久精品九色 | 国产成人一区二区在线观看 | 亚洲精品国产拍在线 | 午夜成人免费电影 | 亚洲香蕉在线观看 | 日本久久精 | 亚洲精品美女久久久久 | 日韩精品欧美一区 | 国产色婷婷精品综合在线手机播放 | 五月天六月丁香 | 日本精a在线观看 | 久久精品视频网站 | 亚洲黄网站 | 亚洲成人av影片 | 在线看v片 | 亚洲精品网页 | 天天摸日日摸人人看 | 国产精品白浆视频 | 国产成人久久精品一区二区三区 | av免费网站在线观看 | 91亚洲网| 精品国产一区二区在线 | 天天操天天添 | 日韩视频免费 | 天天爽天天爽天天爽 | 亚洲一区二区观看 | 丁香五月亚洲综合在线 | 成人h动漫精品一区二 | 日本精品一区二区三区在线播放视频 | 亚洲欧美一区二区三区孕妇写真 | 亚洲美女视频在线 | 欧美最猛性xxxxx亚洲精品 | 波多野结衣在线观看视频 | 久久九九精品 | 色婷婷色 | www.com.日本一级 | 中文字幕91视频 | 久草在线手机视频 | 色婷婷久久一区二区 | 国产成人一区二区三区在线观看 | 超碰人在线 | 人人爽人人爽人人片av免 | 日韩三级中文字幕 | 亚洲人成网站精品片在线观看 | free. 性欧美.com | 亚洲播放一区 | 91视频免费国产 | 国产精品激情 | 91精品国自产在线观看欧美 | 成人精品在线 | 91 在线视频 | 91传媒在线看 | 国产精品久久一区二区无卡 | 欧美精品乱码久久久久久 | 天天激情综合网 | 亚洲涩涩一区 | 99婷婷狠狠成为人免费视频 | 伊人射 | 日本精品在线看 | 亚洲精品欧美成人 | 黄色成人免费电影 | 99在线看 | 国产精品乱码久久久 | 亚洲国产小视频在线观看 | 精品国产乱子伦一区二区 | 国产精品久久久久久久久久久久冷 | 97久久久免费福利网址 | 又黄又爽又无遮挡免费的网站 | 国产精品淫 | 亚洲国产中文在线观看 | 中文字幕第 | 日本黄色免费看 | 国产裸体永久免费视频网站 | 久久这里只有精品23 | 国产精品久久久久影视 | 免费电影播放 | 日p视频在线观看 | 91麻豆精品国产自产 | 伊人va | 国产精品一区在线观看 | 天天爱天天色 | 国产精品18久久久久久久久久久久 | 五月天婷婷狠狠 | 欧美不卡视频在线 | 亚洲精品黄色片 | 在线观av | 国产成人精品综合 | 国产午夜三级一区二区三桃花影视 | 狠狠干综合| 日本中文字幕电影在线免费观看 | 在线电影91 | 美国av片在线观看 | 国产在线一区二区 | 九九在线精品视频 | 国产黄色大片 | 黄色a大片 | 欧美精品一二三 | 国产精品9999久久久久仙踪林 | 精品国产电影 | 亚洲一区二区三区四区在线视频 | 97精品国产aⅴ | 99精品热视频只有精品10 | 亚洲国产成人高清精品 | av成人免费在线 | 精品国自产在线观看 | 色婷婷综合久久久 | 手机看片国产日韩 | 久久艹艹 | av电影在线免费 | 国产精品原创av片国产免费 | 91在线文字幕| 日韩丝袜 | 国产精品激情偷乱一区二区∴ | 97色综合 | 中文字幕一区二区在线播放 | 国内三级在线观看 | 久久97精品 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 中文字幕免费高清 | 国产人成在线视频 | 色九九在线 | 国产一区av在线 | 99re在线视频观看 | 草 免费视频 | 久久国产精品99久久久久久老狼 | 亚州欧美精品 | 欧美十八 | 在线视频免费观看 | 日本久久中文 | 日韩狠狠操 | 婷五月激情 | 在线中文字幕电影 | 久久婷婷亚洲 | 中文字幕在线国产精品 | 韩国av免费观看 | a成人v | 亚洲视频在线观看 | 免费观看一级特黄欧美大片 | 久草com| 亚洲精品乱码久久久久久按摩 | 成人av影视 | 在线视频 你懂得 | 日日草天天草 | 日本成人黄色片 | 亚洲涩涩色 | 色婷婷99| 免费v片 | av片子在线观看 | 欧美日韩一区二区三区在线观看视频 | 色综合 久久精品 | 色中色资源站 | 超碰免费97 | 久久96国产精品久久99软件 | 一区在线播放 | 午夜精品久久久久久久99水蜜桃 | 黄色片网站av | 国产在线a不卡 | 久久精品视频99 | 日韩欧美精品在线观看视频 | 99久久99久久免费精品蜜臀 | 日韩av在线看| 欧美激情精品久久 | 欧美福利片在线观看 | 欧美性护士 | 91看片麻豆| 亚洲精品中文字幕视频 | 国产精品国产三级国产aⅴ9色 | 色综合天天综合网国产成人网 | 国产精品一区二区视频 | 99激情网 | 麻豆国产露脸在线观看 | 91精品久久久久久久99蜜桃 | 国产免费一区二区三区最新 | 日本动漫做毛片一区二区 | 国产精品婷婷午夜在线观看 | 欧美一区二区在线刺激视频 | 国产精品久久 | 欧美一级片在线播放 | 亚洲欧美成人在线 | 夜夜骑日日 | 国产麻豆电影在线观看 | 在线播放 一区 | 久久精品1区 | 四虎影视成人永久免费观看亚洲欧美 | 中文字幕免费成人 | 婷婷久久久久 | 久久视频| 久久国产精品99久久久久 | 在线观看的黄色 | 日韩欧美精品一区二区三区经典 | 精品免费久久久久久 | 久久国产高清视频 | 日本少妇久久久 | 国产精品久久久久久久久蜜臀 | 国产精品午夜久久 | 美女黄网久久 | av成人免费在线观看 | 免费网址在线播放 | 在线观看电影av | 久久国产精品免费视频 | 国产黄色播放 | 99这里都是精品 | 亚洲国产免费网站 | 欧美日韩精品在线视频 | 国产视频久久久久 | 天天av综合网 | 国产裸体无遮挡 | 美女免费电影 | 中文字幕网站 | 久久精品国产亚洲 | 国产一级在线 | 免费看v片网站 | 五月激情丁香 | 天天躁日日躁狠狠躁av中文 | 久草在线资源免费 | 久久精品免视看 | 国产精品久久久久一区二区三区共 | 国产韩国精品一区二区三区 | 久久精品这里热有精品 | www黄色av| 91精品国产欧美一区二区成人 | 成人在线免费观看网站 | 91精品国产高清自在线观看 | 免费男女羞羞的视频网站中文字幕 | 天天插天天干天天操 | 香蕉视频一级 | av一本久道久久波多野结衣 | 中文字幕日韩国产 | 在线国产日韩 | 日本视频精品 | 国产在线观看地址 | 一区二区网 | 在线观看视频免费播放 | 亚洲精品乱码久久久久久蜜桃91 | 看毛片网站 | 久久国产女人 | av一级一片 | 操操日 | 精品国产区在线 | 国产日韩精品在线观看 | 日韩资源在线观看 | 丰满少妇在线观看网站 | 欧美日韩在线观看一区 | 碰超在线 | 国产精品免费人成网站 | jizz欧美性9 国产一区高清在线观看 | 亚洲aⅴ在线 | 99国产一区二区三精品乱码 | 欧美日韩国产精品一区二区三区 | 久久久久色 | 免费大片av | 五月天天av | 婷婷中文在线 | 久久伊99综合婷婷久久伊 | 国产成人精品亚洲 | 天天操狠狠操网站 | 天天爽网站 | 日韩午夜三级 | 日韩专区 在线 | 五月丁色| 久久99久久99精品免观看粉嫩 | 亚洲资源一区 | 天天操一操| 操久在线 | 国产女人40精品一区毛片视频 | 亚洲综合丁香 | 四虎免费在线观看 | 日韩精品一区电影 | 国产精品久久久久久久久久久久 | 2019av在线视频 | 五月激情电影 | 久久亚洲热| 国产四虎影院 | 亚洲午夜精品在线观看 | 五月婷婷在线视频观看 | 夜夜爱av | 欧美性受极品xxxx喷水 | 国产麻豆果冻传媒在线观看 | 亚洲久草在线视频 | 亚洲精品在线视频观看 | 久久久久国产精品一区二区 | 久久久99精品免费观看乱色 | 亚洲国产中文字幕 | 日韩欧美精品在线观看 | 亚洲国产精品久久久久久 | 天堂成人在线 | 欧美日韩激情视频8区 | 国产免费观看久久 | 久久亚洲综合国产精品99麻豆的功能介绍 | 日韩成人在线一区二区 | 欧美a√在线 | 超碰公开在线观看 | 国外成人在线视频网站 | 亚洲欧洲美洲av | 热久久精品在线 | 久久成人黄色 | 国产精品美女久久 | 99精品视频99 | 色99导航| 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲午夜久久久久 | 国产成人性色生活片 | 欧美日韩国产一区二 | 久久手机精品视频 | 免费a视频在线观看 | 综合色天天 | 精品在线观看一区二区 | 精品国产乱码久久久久久1区二区 | 操操操天天操 | 久久久黄视频 | 97在线观看视频免费 | 国产精品久久久久aaaa | 五月婷婷六月丁香在线观看 | 欧美日韩国产精品一区二区亚洲 | 亚洲网久久 | 中文字幕激情 | 久久99亚洲精品久久 | 人人澡人人爱 | 最近高清中文在线字幕在线观看 | 久久男人中文字幕资源站 | 免费在线观看亚洲视频 | 亚洲精品综合在线观看 | 国产精品久久久久久影院 | 中文字幕在线免费97 | 久久伊人八月婷婷综合激情 | 日韩av中文字幕在线免费观看 | 婷婷激情五月综合 | 五月天.com | 99视频一区| 欧美日韩性视频 | 国产涩涩网站 | 免费久久99精品国产婷婷六月 | 美女久久久久久久久久久 | 狠色在线| 日韩欧美中文 | 中文字幕精品三级久久久 | 在线观看免费av网站 | 亚洲精品高清视频 | 久久国产精品99久久人人澡 | 91精选在线观看 | 成年人视频在线免费播放 | 国产视频 亚洲精品 | 日韩av免费在线电影 | 亚洲区色 | 国产精品久久久久久久久久东京 | 超碰在线公开免费 | 在线观看一级片 | 免费涩涩网站 | 视频在线观看一区 | 日韩偷拍精品 | 丁香婷婷亚洲 | 欧美一进一出抽搐大尺度视频 | 亚洲激情 欧美激情 | 麻豆精品传媒视频 | 久久免费资源 | 五月婷婷在线观看 | 狠狠操精品| 91人人爽人人爽人人精88v | 国产一区二区三精品久久久无广告 | 91九色国产在线 | 国产精品一区二区免费 | 偷拍精偷拍精品欧洲亚洲网站 | 亚洲精品自拍视频在线观看 | 四川妇女搡bbbb搡bbbb搡 | 97超碰中文字幕 | 亚洲欧美日韩一区二区三区在线观看 | 日本99热| 久久精品综合网 | 欧美黄在线 | 久草网免费 | 91chinese在线| 亚洲在线色 | 激情 亚洲| 91黄色影视 | 99国内精品 | 久久精品韩国 | 久久精品官网 | 黄色免费av | 婷婷综合久久 | 久久乐九色婷婷综合色狠狠182 | av大全在线免费观看 | 韩国av三级 | sesese图片 | 51久久成人国产精品麻豆 | 精品视频在线视频 | 91一区在线观看 | 成+人+色综合 | 在线国产一区二区三区 | 热久久这里只有精品 | 精品视频免费播放 | 午夜视频导航 | 国产专区在线视频 | 99久久精品午夜一区二区小说 | 国产精品视频永久免费播放 | 精品视频免费久久久看 | 日韩成人精品 | 日日夜夜骑| 中文字幕在线视频一区 | 亚洲一区黄色 | 91九色在线 | 四虎伊人 | av在线免费观看网站 | 久久丁香| 久久久久麻豆 | 欧美日韩久久不卡 | 国产精品久久99综合免费观看尤物 | 日韩精品久久一区二区 | 综合国产在线观看 | 国产 日韩 中文字幕 | 成人免费视频a | 国产成人黄色片 | 国产在线观看免费观看 | 91视频这里只有精品 | 97精品国产91久久久久久久 | 久久成人高清 | 中文字幕在线观看完整版电影 | 人人爽人人澡人人添人人人人 | 国产精品自产拍在线观看桃花 | 国产精品九九九 | 国产一区二区精品久久91 | 五月婷婷综合激情网 | 国产999视频在线观看 | 91超碰在线播放 | 国产精品亚 | 国产成人在线播放 | 久久国产精品免费一区二区三区 | 久久精品国产99 | 2019精品手机国产品在线 | 久久99久国产精品黄毛片入口 | 国产精品美女久久久网av | 色狠狠久久av五月综合 | 97碰视频| 精品在线看 | 国产精品黑丝在线观看 | 久久69av| 天天射天 | 亚洲成人精品在线 | 亚洲每日更新 | 国产精品99久久久精品免费观看 | 国产最新在线 | 91精品国自产在线观看欧美 | 91久久国产露脸精品国产闺蜜 | 国产一区二区免费看 | 91在线免费观看国产 | 9在线观看免费高清完整版在线观看明 | 亚洲精品88欧美一区二区 | 欧美做受高潮1 | 国产视频资源 | 久久九九精品 | 日韩欧美在线综合网 | 97人人添人澡人人爽超碰动图 | 麻豆视频大全 | 激情xxxx | 69国产盗摄一区二区三区五区 | 国产精品对白一区二区三区 | 亚洲一区二区黄色 | 久草电影网 | 深夜视频久久 | 日本精品一二区 | 国产亚洲视频系列 | www.婷婷com| 日日夜夜天天人人 | 99热精品久久 | 91av资源网 | 国产综合视频在线观看 | 久久精品资源 | 中文字幕在线播放日韩 | 亚洲午夜久久久久久久久久久 | 激情丁香| 久久蜜臀一区二区三区av | 亚洲综合色视频在线观看 | 日本mv大片欧洲mv大片 | 欧美亚洲久久 | 国产精品精品久久久久久 | 日韩中文字幕在线看 | 成人av电影免费在线播放 | 91视频啪| 中文在线a天堂 | 尤物一区二区三区 | 亚洲免费成人 | 黄色小网站在线观看 | 久热电影 | 欧美 亚洲 另类 激情 另类 | 国内99视频 | 久久福利综合 | 久久伊人五月天 | 午夜久久久精品 | 99精品国产在热久久 | av日韩国产 | 久草视频一区 | 狠狠操狠狠干2017 | 夜夜操狠狠操 | 国产在线精品一区 | 国产91电影在线观看 | 欧美性黑人 | 精品特级毛片 | www.香蕉视频 | 日韩精品中文字幕av | 亚洲综合欧美日韩狠狠色 | 免费看国产精品 | 亚洲三级网站 | 波多野结衣一区 | 超碰在线观看97 | 六月丁香在线观看 | 亚洲精品视频免费在线 | 久草视频在线观 | 去看片 | 中文字幕在线看 | 国产亚洲一区 | 91视频久久| 中文字幕视频一区 | 亚洲综合在线播放 | 国产日产精品一区二区三区四区的观看方式 | 欧美日韩免费观看一区二区三区 | 欧美一级日韩免费不卡 | 国内一区二区视频 | 麻豆你懂的 | av电影免费观看 | 久久免费的精品国产v∧ | 久久婷婷精品 | 久久久久久国产精品999 | 九九热re| 九九视频免费观看视频精品 | 亚洲色图色 | 色婷婷狠狠五月综合天色拍 | 少妇bbbb搡bbbb搡bbbb | 婷婷在线免费 | 天天爽天天爽夜夜爽 | 欧美激情综合色综合啪啪五月 | 一区二区激情视频 | 久久精品牌麻豆国产大山 | 久久99视频免费观看 | 日韩欧美黄色网址 | 人人网av | 日韩视频一区二区在线 | 日日草天天干 | 伊人日日干| 欧美激情综合五月色丁香 | 九九视频免费在线观看 | 亚洲 欧洲 国产 日本 综合 | 夜夜操天天 | 亚洲成人在线免费 | 激情图片区| 成人97人人超碰人人99 | 一区三区在线欧 | 在线播放一区 | 超碰久热| 国产精品系列在线 | 久久精品毛片基地 | 日韩视频在线不卡 | 中文字幕文字幕一区二区 | 日本中文字幕在线看 | 日韩精品在线观看视频 | 国产一区在线不卡 | 国产色婷婷在线 | 国产黄av | 欧美国产亚洲精品久久久8v | 免费精品视频在线 | 国产伦精品一区二区三区四区视频 | 久久免费视频在线观看 | 13日本xxxxxⅹxxx20 | 久久免费国产精品 | 2019国产精品| 狠狠久久婷婷 | 午夜国产一区二区 | 精品久久久久久综合日本 | 91久久电影 | 久久综合久久88 | 国产香蕉av | 人人爱人人舔 | 99资源网 | 一区二区三区动漫 | 一级淫片在线观看 | 久久久久国产精品一区二区 | 国产伦精品一区二区三区免费 | 国产香蕉久久 | 精品久操| 国产一级三级 | 奇人奇案qvod | 欧美日韩一区二区三区在线观看视频 | 亚洲国产小视频在线观看 | 婷婷激情久久 | 国产精美视频 | 久草综合在线观看 | 夜夜躁狠狠躁日日躁 | 99久久综合精品五月天 | 成人在线视频在线观看 | 久久久黄视频 | 亚洲精品国产麻豆 | 丁香六月综合网 | 婷婷夜夜 | 国产精品12 | 精品av在线播放 | 国产少妇在线观看 | 欧美高清视频不卡网 | 日本中文字幕一二区观 | 国产一级在线看 | 成年人视频在线免费观看 | 国产精品av久久久久久无 | 91免费高清观看 | 日本久久精 | 开心激情五月网 | 园产精品久久久久久久7电影 | 手机在线看片日韩 | 日一日操一操 | 久久这里只有精品视频首页 | 三级黄色在线 | 成人av电影免费在线播放 | 国产精品自在欧美一区 | 国产资源网 | 亚洲高清在线观看视频 | 午夜视频黄 | 亚洲三级国产 | 超碰97成人 | 日韩有码第一页 | 99视频在线免费看 | 国产不卡免费视频 | 色综合天天天天做夜夜夜夜做 | 日韩欧美精品一区二区 | 国产一级精品视频 | 亚洲黄色app | 日本中文字幕高清 | 国产黄av| 不卡的av电影在线观看 | 国产一级视频在线免费观看 | 91| 婷婷色在线资源 | 欧美极品xxxxx| 亚洲最大色| 手机色站 | 欧美,日韩 | 久久久久在线视频 | 欧美综合在线视频 | 欧美一区二区三区特黄 | 日本中文字幕影院 | 久久大视频 | 高清美女视频 | 99视频播放 | 99在线观看视频网站 | 日本女人b| 亚洲区另类春色综合小说校园片 | 成人免费看片网址 | 国产午夜激情视频 | 91精品欧美 | av三级在线播放 | 中文字幕日本在线观看 | 在线观看视频h | 亚洲国产欧美在线看片xxoo | 久久综合五月婷婷 | 久久夜色精品国产欧美乱极品 | 91麻豆精品91久久久久同性 | 欧美成年人在线观看 | 蜜桃视频色 | 日韩免费小视频 | 成年人免费电影 | 欧美精品一区二区蜜臀亚洲 | 国产丝袜| 午夜91视频 | 天天色综合天天 | 丁香六月久久综合狠狠色 | 懂色av一区二区三区蜜臀 | 18国产精品白浆在线观看免费 | 97超碰.com | 国产999精品久久久影片官网 | 狠狠干综合| 高清日韩一区二区 | 免费aa大片 | 99久久婷婷 | 久久永久免费视频 | 国产手机视频在线播放 | 国产99久久久国产精品免费看 | 麻豆传媒电影在线观看 | 精品国产一区二区三区蜜臀 | 免费视频一区二区 | 日韩久久一区二区 | 欧美成年人在线观看 | 911香蕉视频 | 天天综合狠狠精品 | 久久精品官网 | 色多多在线观看 | 国产亚洲精品久久久久久久久久久久 | 中文字幕色播 | 中文字幕av在线播放 | 久久久久久久久久电影 | 久草青青在线观看 | 99精品视频在线免费观看 | 成人黄色av免费在线观看 | 久久精品视频观看 | 欧美日韩国产精品爽爽 | 亚洲一区二区天堂 | 综合久久五月天 | 亚洲精品美女在线观看播放 | 91精品国产自产在线观看永久 | 99久久精品免费看国产一区二区三区 | 国产色秀视频 | 午夜a区 | 久久国产精品系列 | 国产精品久久免费看 | 午夜少妇 | 日日精品| 亚洲精品2区 | 天天射天天拍 | 国产群p| 精品国产伦一区二区三区免费 | 久久久久日本精品一区二区三区 | 国产成人精品综合久久久久99 | 成人黄色小说视频 | 在线国产日本 | 日韩在线免费小视频 | 国产一区二区高清 | 国际av在线 | 在线不卡中文字幕播放 | 9ⅰ精品久久久久久久久中文字幕 | 国产破处精品 | 91亚色视频 | 九色91福利 | 91av免费在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 亚洲精品视频在线观看免费视频 | 亚洲精品中文在线 | 色网站免费在线观看 | 亚洲综合丁香 | 中文字幕在线观看完整版电影 | 久久精品久久精品 | 亚洲一级影院 | 91在线免费观看国产 | 亚洲国产午夜 | 婷婷丁香国产 | 精品久久久久一区二区国产 | 国产伦理久久精品久久久久_ | wwwwww色| 激情 婷婷| 99热最新 | 亚洲精品在线观看网站 | 国产精品久久久久久久久毛片 | 国产精品美女久久久免费 | 天天操人人要 | 九九九视频精品 | 亚洲欧美日韩精品久久久 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 国产亚洲午夜高清国产拍精品 | 天天色天天草天天射 | 高清在线一区二区 | 91九色视频在线 | 日韩欧美69| 免费h视频 | 亚洲国产精久久久久久久 | 精品美女国产在线 | 天天鲁天天干天天射 | 久久九九网站 | 最新色站| www.av在线播放 | 色综合久久综合中文综合网 | 狠狠的操狠狠的干 | 超碰在线97观看 | 国产精品正在播放 | 麻豆视频免费在线播放 | 91在线资源 | 在线a亚洲视频播放在线观看 | 超碰在线个人 | 丁香婷婷久久 | 狠狠88综合久久久久综合网 | 亚洲精品美女视频 | 欧美一区二区伦理片 | 婷婷激情在线观看 | 91九色九色| 久久久久国产精品午夜一区 | 久久精品久久精品久久 | 精品免费国产一区二区三区四区 | 黄色福利网 | 香蕉视频日本 | 国产精品一区在线播放 | 精品视频一区在线观看 | 一区二区三区免费在线 | 日韩一级电影在线观看 | 精品日韩中文字幕 | 天天爱天天插 | 在线导航av| 午夜av影院 | 天天射成人| 国产视频在线观看一区 | 国产午夜麻豆影院在线观看 | 黄色软件网站在线观看 | av在线等 | 亚洲欧美日本一区二区三区 | 国产特级毛片aaaaaaa高清 | 精品久久久久久久久久 | 久久久精品国产免费观看同学 | 午夜影院日本 | 色吊丝在线永久观看最新版本 | 日日干日日 | 成年人免费看片网站 | 在线视频中文字幕一区 | 一区二区三区精品久久久 | 国产亚洲永久域名 | 欧美精品一区二区在线观看 | 摸bbb搡bbb搡bbbb | 在线观看韩日电影免费 | 婷婷色在线观看 | 9在线观看免费高清完整版在线观看明 |