大蕉蕉的三道 Java 私房菜 No.131

举报
Tracy 发表于 2019/11/04 14:48:52 2019/11/04
【摘要】 以下文章来源于一名叫大蕉的程序员 ,作者大蕉一名叫大蕉的程序员感谢订阅,我叫杨钊,也叫big banana,大家都叫我大蕉。技术探针一枚。主要分享最近关注或者将要关注的东西。万一能对您有一点点的帮助那就更好了。点击上方“方志朋”,选择“置顶或者星标”你的关注意义重大!大蕉蕉每个月写这么多 Java 代码呢,也存着很多私房菜,也总结下给大家玩玩,用完保证代码量 biu biu biu 飙升,信...

以下文章来源于一名叫大蕉的程序员 ,作者大蕉

一名叫大蕉的程序员

一名叫大蕉的程序员

感谢订阅,我叫杨钊,也叫big banana,大家都叫我大蕉。技术探针一枚。主要分享最近关注或者将要关注的东西。万一能对您有一点点的帮助那就更好了。


点击上方方志朋”,选择“置顶或者星标”



你的关注意义重大!




大蕉蕉每个月写这么多 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(){}
}


就酱,我不知道你喜不喜欢,我反正每天都在写。

如果觉得本文不错,记得右下角进去关注大蕉的公众号


-更多文章-

数据库中间件详解 | 珍藏版

Java 性能优化的 45 个细节

哥们,你真以为你会做这道JVM面试题?

如何阅读Java源码?


-关注我-

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

看完了,帮我点个“好看”鸭

点鸭点鸭

转载声明:本文转载自公众号【方志朋】。

原文链接:

https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247485412&idx=2&sn=ff0a1e6bbdb87db9a8a9b132efe344c0&chksm=9bed2696ac9aaf80ce2cdd856e4ccde140eb2755f18db50790ff4cb5272fe1f5c0a54628d248&scene=21#wechat_redirect

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。