幾個月前我爲公司寫一個用於實現RESTful API的項目基礎框架,它是一個位於spring cloud項目中的open service內的基礎框架,用來統一處理請求和返回。其中,爲了實現數據的轉換,我開發了一個小工具,叫作「FastConverter」。最初它被用來將數據實體轉換爲json string,在轉換的過程當中,使用註解的方式來定義數據轉換邏輯。java
後來在完成其餘一些公司任務的過程當中,我發現,這個FastConverter比我預期的還好用。它成功的將那些修飾數據形式的代碼從業務邏輯代碼中分離了出去。我不用在開發過程當中去關心數據最後要呈現的樣子,它們會被註解安全的修飾,並優雅的解決。git
完整的FastConvert原理在個人另外一篇博客《記一個小小的轉換工具的開發:FastConverter》中。程序員
public class CommonConverterFilter extends AbstractConverterFilter { [@Override](https://my.oschina.net/u/1162528) protected void initConverters(List<Converter<?, ?>> converters) { converters.add(new StringConverterHandler()); converters.add(new NumberToStringConverterHandler()); converters.add(new BooleanToStringConverterHandler()); converters.add(new DateToTimeStampStringConverterHandler()); converters.add(new NullConverterHandler()); converters.add(new MapToMapConverterHandler<>(this)); converters.add(new ArrayToListConverterHandler<>(this)); converters.add(new CollectionToListConverterHandler<>(this)); converters.add(new BeanToMapConverterHandler(this)); } }
在fastconverter中,有轉換器過濾器(ConverterFilter)這一律念,你能夠編寫一個依賴於ConverterFilter的轉換器,ConverterFilter可以爲你提供一些默認數據的轉換邏輯。好比上面代碼所示的ConverterFilter。它是FastConverter提供的通用ConverterFilter,該ConverterFilter提供了對String,Number(包括int,long,double,float,BigDecimal),布爾值,日期,空,Map,數組,Collection,以及java Bean的默認轉換方式的支持。固然你能夠去實現你本身的ConverterFilter。github
其中,BeanToMapConverterHandler的實現是對ConverterFilter使用的最好示例,同時BeanToMapConverterHandler成爲了FastConverter好用的關鍵。簡單來講,BeanToMapConverterHandler使用ConverterFilter提供的默認轉換器來執行默認轉換,而你,能夠經過在Bean的域上配置@FieldConverter註解來指定特定的轉換器對數據進行轉換。spring
個人某些Bean長這個樣編程
public class LoanApplyInfoFileUploadEntity implements BaseEntity { private String name; @Field(name = "pid") private String idCard; @FieldConverter(converter = LoanPurposeConverter.class) private String loanPurpose; @FieldConverter(converter = DateToFormatStringConverterHandler.class, tip = "yyyy-MM-dd'T'HH:mm:ss") private Date uploadTs; @FieldConverter(converter = DateToFormatStringConverterHandler.class, tip = "yyyy-MM-dd") private Date dueDate; @FieldConverter(converter = DateListToStringConverter.class, tip = "yyyy-MM-dd") private List<Date> targetRepayDateList; ... 省略getter,setter
我只須要使用數據的原始java類型來組裝bean,組裝時也不用關心數據未來須要變成什麼樣子,不管數據未來會變成什麼樣,都有與邏輯分離的轉換器能夠一鍵解決(固然,你能夠不使用BeanToMapConverterHandler,你能夠編寫適用於本身的BeanToXXXConverterHandler,或者其餘任何ConverterHandler)。json
關注點分離真的是編程工做中最得力的一把利器,是寫出優雅代碼的關鍵。記得《java編程思想》的「併發」一章,在聊到併發的做用時,舉了一個事件驅動的例子。數組
實際上,使用併發最吸引人的一個緣由就是要產生具備可響應的用戶界面。考慮這樣一個程序,它由於將執行某些長期運行的操做,因此最終用戶輸入會被忽略,從而成爲不可響應的程序。若是有一個‘退出’按鈕,那麼你確定不想在你寫的每一段代碼中都檢查它的狀態。由於這會產生很是尷尬的代碼,而咱們也沒法保證程序員不會忘記檢查。若是不使用併發,則產生可響應用戶界面的惟一方式就是全部的任務都週期性地檢查用戶輸入。安全
這雖是一個對併發能力的場景描述,但它也讓我想到了關注點分離,寫一個專門的併發程序去監聽按鈕的狀態,就是一種關注點分離。雖然關注點分離是如此的重要和常見,但不得不說,我仍是見到了許多「在每一段代碼中都檢查它的狀態」的代碼。實際上,代碼上出現這種問題,還不是最可怕的,最可怕的是項目架構上出現這種問題,我相信有不少程序員在遭受這種架構的折磨。架構
若是你在開發的過程當中遇到了數據轉換方面的需求,不妨來試一試FastConverter吧,若是你有好的想法,歡迎交流,歡迎PR,它在這裏(FastConverter的Github地址)