三道 Java 私房菜
大蕉蕉每個月寫這麼多 Java 程式碼呢,也存著很多私房菜,也總結下給大家玩玩,用完保證程式碼量 biu biu biu 飆升,信我。
Top1 : ResultExecutor + ResultDTO 組合
首先說下為什麼會出現這個組合,這個組合我是在第二份工作的時候才學到的。不知道大家還有沒有印象,很多時候我們寫一些介面的時候,有可能會給呼叫方返回一個非常雞肋的 500 錯誤。使用了這個組合,能從根本上解決 500 錯誤。這個組合對於錯誤異常等的封裝非常好,寫法規範,值得學習。希望大家也在自己的專案裡整一個,從此告別500錯誤,反正我是再沒見過500了。
這個組合定義了一個 ResultExecutor 的抽象 run 方法,用來解決怎麼處理以及返回什麼引數的問題,在使用的時候直接使用匿名類的方式實現自己想要的業務邏輯就好了。
第二呢,用一個 ResultDTO 將返回的結果規範化起來,這也保證了無論我們程式邏輯是怎樣的,業務方肯定能獲取到一個結果,至於結果是success 還是 fail,需要業務方通過欄位來確認。
public abstract class ResultExecutor<T> { abstract T run(); public ResultDTO<T> execute(){ try{ T runResult = run(); ResultDTO<T> result = new ResultDTO<>(); result.setSuccess(true); result.setData(runResult); return result; }catch (Throwable t){ ResultDTO<T> result = new ResultDTO<>(); result.setSuccess(false); return result; } } }
public class ResultDTO<T> { private T data; private Boolean success; }
public class BananaService { public ResultDTO<Boolean> runSomeThing(){ return new ResultExecutor<Boolean>() { @Override Boolean run() { /** * 寫邏輯 */ return true; } }.execute(); } }
Top2 : Center+Processor 組合
這個組合呢,好處就是能把很多的邏輯不同階段的資料處理,拆分到不同的類裡邊去編寫,這對於程式碼邏輯的解耦能起到非常非常好的作用,這對於狀態機類的處理非常友好,因為狀態機可能有幾十個狀態需要一一處理,如果都寫在同一個類裡那可能 if else 馬上把你繞暈了。
這個呢,在一些分類比較多的場景,也建議你嘗試一下,拓展性非常非常好。而且這個套路可以一直往下套,可以往下套個三四層什麼的。
public class ExecuteCenter { @Resource Set<BaseExecuteProcessor> processorSet; public void execute(String type,String params){ for(BaseExecuteProcessor executeProcessor :getProcessors(type)){ executeProcessor.execute(params); } } private List<BaseExecuteProcessor> getProcessors(String type){ return processorSet.stream().filter(processor -> type.equals(processor.getSupportType())).collect(Collectors.toList()); } }
public interface BaseExecuteProcessor { String getSupportType(); void execute(String params); }
Top3 : Enum + swith 組合
這個我真的是很喜歡,在很多地方,只要需要根據某個列舉的狀態來做一些額外的處理,到了一定程度,又不想寫太多類去處理這些問題,我就用 Enum + Switch 來解決。
好處就是,無論功能有多少有多深,入口是統一的,新增一個列舉型別幾乎毫無成本,更改一個不會影響到其他的分支實現。
public enum SomeTypeEnum { T1,T2,T3,T4; public void main(String[] args){ String type = "T1"; SomeTypeEnum someTypeEnum = SomeTypeEnum.valueOf(type); switch (someTypeEnum){ case T1:{ executeT1();break; } case T2:{ executeT2();break; } default:{ } } } private void executeT1(){} private void executeT2(){} }
就醬,我不知道你喜不喜歡,我反正每天都在寫。