• Home
  • 归档
文章检索 作品与友邻 关于我
暴君乔博客
Home 归档

程序员思考之道

发布于: 2022-01-23
更新于: 2023-07-09
文章目录
  1. 程序员
    1. 规约
    2. 开发
    3. 参考文档

程序员

这篇文章主要是总结 Java 方面的,自己学习的一些见解地方

规约

  • POJO 类的布尔类型变量不准使用 is 前缀开头,因为在部分序列化框架中,会把 isDeleted 误以为 deleted 才是变量名
  • 常量复用层次
    • 二方包 client.jar 的 constant 目录(跨应用)
    • 一方库子模块的 constant 目录(应用内)
    • 子工程目录(当前子工程)
    • 当前包的 constant
    • 当前类
  • BigDecimal 的 equals 和 compareTo
    • a=0.1 b=0.10000 a.equalsTo(b)=false equals 除了比较值还会比较精度
    • a=0.1 b=0.10000 a.compareTo(b)==0 = true compareToz 只比较值
  • float 转 BigDecimal 时,注意new BigDecimal(String) or BigDecimal.valueOf(float);
  • 关于基本数据类型与包装数据类型
    • POJO 必须使用包装数据类型(比如说数据库为 null,如果为基本数据类型,则可能会从 null 初始为 0,导致显示意义有误)
    • RPC 的返回值和参数必须包装数据类型
    • 禁止同时存在 xxx 属性的 isXXX 方法和 getXXX 方法 有的序列化框架中未对 is 和 get 做优先级的查询,所以在做 get 方法时,可能会随机调用不同的函数
  • Collectors.toMap() 如果 value 为空会抛异常
  • 集合转数组的方法:list.toArray(new String[0]) 等于 0 的话会动态创建等于 size 的数组,性能最好,其他 gc 负担大
  • 使用 Collection 接口的addAll()方法第一行代码是inputParam.toArray()有 NPE 风险,所以要做好入参空判断
  • PECS 原则(Producer Extends Consumer Super)
    • 频繁向外读取内容的,适合用<? extends T>
    • 频繁往里插入的,使用用<? super T>
  • ConcurrentHashMap 不允许存入 null 的 value 值
  • 前后端交互
    • 对于超大整数,统一使用String返回,不能使用Long类型,因为js会转为Number类型(类似于Java的Double)有精度丢失风险
  • 日志
    • 应使用日志框架的API,而不是日志系统中的API
    • 禁止使用JSON工具打印对象,如果对象里面有get方法抛出异常,将导致因为日志输出而中断流程
  • 中间件
    • tair
      • 对于双集群的缓存进行put和删除动作时,必须先invalid后,再进行put或者删除的动作
    • 数据库保存先成功,再进行缓存的更新操作
  • 单元测试
    • AIR原则(Automatic Independent Repeatable)
    • 测试案例不能依赖,不能有先后顺序
    • 对于第三方资源的依赖,设计时通过注入,测试时在DI框架上通过注入本地实现,或者Mock实现
    • 单测一般只针对方法,最多到类级别,对于跨类和跨系统的,属于集成测试的领域
    • 编写时遵守BCDE原则
      • Border 边界,循环边界,特殊取值,时间点,数据顺序
      • Correct 正确输入,预期结果与实际结果
      • Design 结合设计文档编写
      • Error 强制错误信息输入,获得预期结果
  • 数据库
    • 是否使用 is_xxx unsigned tinyint表示

开发

Double-checked Locking is broken

  • 使用 static 单例 `static XXX xx=new XXX();

  • JDK 老版本中,可以通过 ThreadLocal 来判断是否实例化,继而实现懒加载化

  • 或者使用 volatie 加上双重判断,通过 volatile 实现指令不可重排,加上双检查保证懒加载

      private volatie Helper helper=null;
      public Helper getHelper(){
          if(helper==null){
              synchronized(this){
                  if(helper==null){
                      helper=new Helper();
                  }
              }
          }
          return helper;
      }
    

参考文档

  • 阿里巴巴开发规约
  • double Checked locking
程序员思考之道
/archives/aa08646d/
作者
tyrantqiao
发布于
2022-01-23
更新于
2023-07-09
许可协议
CC BY-NC-SA 4.0
赏

蟹蟹大佬的打赏,大家一起进步

支付宝
微信
  • 技术

扫一扫,分享到微信

微信分享二维码
JDK8特性学习附案例
扫码登录的实现逻辑
© 2026 tyrantqiao 本站总访问量次 本站访客数人次 载入天数...载入时分秒...
  • 文章检索
  • 作品与友邻
  • 关于我

展开标签

  • 随笔
  • 旅行
  • Java
  • 面经
  • 源码
  • 架构
  • Hadoop
  • 计算机网络
  • 技术
  • IDEA
  • maven
  • JDK
  • Linux
  • MySQL
  • 性能
  • 数据库
  • Redis
  • MQ
  • Spring
  • SquirrelFin
  • 记账
  • Android
  • 个人财务
  • TIDB
  • unity
  • chatgpt
  • 前端
  • Vue
  • Git
  • shadowsocks
  • Hexo
  • 问题排查
  • 业务
  • JVM
  • 算法
  • nginx
  • ssh
  • Python
  • 爬虫
  • test
  • vim
  • 影视剧
  • 中间件
  • 事务
  • 表达
  • 运动
  • mybatis
  • 域名
  • AI
  • 产品
  • 家装
  • 土巴兔
  • github
  • 软件
  • 个人项目
  • Leaves
  • 幽默
  • 穿搭
  • 画画
  • 缓存
  • 摄影
  • 设计模式
  • c
  • 课程设计
  • 调酒
  • 数学

Collection

作品与友邻

我做的小工具、朋友的站点和一些长期值得回访的灵感来源。

  • 土 土巴兔 AI 导购交互演示 可点击体验用户导购、平台运营、装修公司、材料商及 AI 话术知识库的多端增长流程。 /demos/tubatu-ai-guide/
  • L Leaves 行程记录 我做的行程记录页面小工具,用来沉淀旅行路线、日程安排和途中的灵感。 https://leaves.tyrantqiao.com/
  • 本 本网站主题yilia设计者的主页 http://litten.me/
tyrantqiao的头像

tyrantqiao

github rss qq mail facebook linkedin

About

关于我

代码、海浪和持续折腾,都是生活的一部分。

<div class="aboutme-card"> <p class="aboutme-eyebrow">tyrantqiao</p> <h3>Java 全栈开发</h3> <p>常年和 Java、后端服务、前端工程、数据与部署打交道,喜欢把复杂问题拆开、写清楚,也把踩坑过程整理成文章留给后来的人。</p> <div class="aboutme-tags"> <span>Java</span> <span>Full Stack</span> <span>Backend</span> <span>Frontend</span> <span>Extreme Sports</span> </div> <p>工作之外偏爱冲浪等极限运动,享受在浪上找平衡,也享受在代码里找边界。</p> <div class="aboutme-contact"> <a href="mailto:[email protected]">Gmail</a> <a href="mailto:[email protected]">QQ Mail</a> </div> </div>