前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >论思维惯性和看源码的重要性

论思维惯性和看源码的重要性

作者头像
明明如月学长
发布2021-08-31 15:40:43
2430
发布2021-08-31 15:40:43
举报
文章被收录于专栏:明明如月的技术专栏

写了很多业务代码,发现一个现象,就是我们人总是用自己已知的知识来解决问题的。

很多代码写多了习以为常了,就形成了惯性。

例一

写多线程的时候,参数经常有如下写法

代码语言:javascript
复制
Runnable runnable = ()->{};

Callable callable = ()->{return xxx;}

其实如果类比较复杂,或者为了实现更好的复用,应该写一个具体的类,定义属性重写run方法。

另外就是潜意识里总是认为Runnable、Callable是多线程“专用”的类/接口,换句话说其他场景不该用。

其实它和Function/Callable/Consumer等本质是一样的,都是方法接口,只是每个都有自己的特点和用途。

当我们封装工具类时可以把它们当做参数。

例二

关于枚举,我们常规的写法是定义一个整形和字符串属性,然后定义枚举常量,习以为常,以为枚举都是,甚至都应该是这么写的。

其实枚举还可以定义抽象方法

代码语言:javascript
复制
public enum LeaveRequestState {
 
    Submitted {
        @Override
        public LeaveRequestState nextState() {
            return Escalated;
        }
 
        @Override
        public String responsiblePerson() {
            return "Employee";
        }
    },
    Escalated {
        @Override
        public LeaveRequestState nextState() {
            return Approved;
        }
 
        @Override
        public String responsiblePerson() {
            return "Team Leader";
        }
    },
    Approved {
        @Override
        public LeaveRequestState nextState() {
            return this;
        }
 
        @Override
        public String responsiblePerson() {
            return "Department Manager";
        }
    };
 
    public abstract LeaveRequestState nextState(); 
    public abstract String responsiblePerson();
}

可以通过抽象方法来实现状态机等功能。

例三

业务中需要传输一个日期参数,格式为 yyyyMMdd的数字格式既Integer类型,值为20190909。

怎么办呢?

看到yyyyMMdd第一印象用DateTimeFormatter, 但是格式化后是字符串格式的啊??!

要不然就用LocalDate分别取年、月、日。

如果月小于10,则年乘以100+月;如果月大于10,则年乘以10再加月。

日以此类推。

其实还有更好的方式

代码语言:javascript
复制
  public static DateTimeFormatter simpleDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");


    /**
     * 获取今天的yyyyMMdd的整数形式
     */
    public static Integer getToday() {
        LocalDate localDate = LocalDate.now();
        String format = simpleDateTimeFormatter.format(localDate);
        return Integer.valueOf(format);
    }

格式化后直接Integer.valueOf就可以了。

虽然没啥难度,但是这个思维转变很重要。

建议

要多积累这种刻板的思维案例,写代码的时候,当发现自己的方法很复杂,就该停下来想想是不是绕弯路了。

我们有时间应该多读一些优秀的开源项目源码,当发现一些“新奇”的写法时,要特别留意。

否则容易以前怎么写就一直怎么写,用一年的经验去干多年的活。

发现源码里好的编程风格,好的编程技巧等要注意学习和积累。

如果觉得本文对你有帮助,欢迎点赞评论,欢迎关注我,我将努力创作更多更好的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 例一
  • 例二
  • 例三
  • 建议
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档