
代码精进之路
代码精进之路
gqltt
这个作者很懒,什么都没留下…
展开
-
阿里Java开发手册~其它
【推荐】任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。【强制】在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。类的属性时,建议直接使用属性名取值即可,模板引擎会自动按。理论,视图的职责是展示,不要抢模型和控制器的活。【推荐】不要在视图模板中加入任何复杂的逻辑。,如方法、变量、类、配置文件、动态配置属性。如果想获取更加精确的纳秒级时间值,使用。,如果想获取整数类型的随机数,不要将。【强制】后台输送给页面的变量必须加。包装类对象,优先调用。类型,注意取值的范围。原创 2023-07-28 10:23:54 · 133 阅读 · 0 评论 -
阿里Java开发手册~注释规约
【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑。【参考】好的命名、代码结构是自解释的,注释力求精简准确、表达到位。代码与注释更新不同步,就像路网与导航软件更新不同步一样,如果导航软件严重滞后,中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高。一个极端:过多过滥的注释,代码的逻辑一旦修改,修改注释是相当大的负担。天书,注释是给自己看的,即使隔很长时间,也能清晰理解当时的思路。标记某代码是错误的,而且不能工作,需要及时纠正的情况。原创 2023-07-28 10:22:32 · 460 阅读 · 0 评论 -
阿里Java开发手册~控制语句
【推荐】循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、语句内的逻辑相当复杂,阅读者需要分析条件表达式的最终结果,才能明确什么。样的条件执行什么样的语句,那么,如果阅读者分析逻辑表达式错误呢?杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。【推荐】接口入参保护,这种场景常见的是用于做批量操作的接口。只会被自己代码所调用的方法,如果能够确定调用方法的代码传入参。)等外,不要在条件判断中执行其它复杂的语句,将复。数错误导致中间执行回退,或者错误,那得不偿失。原创 2024-07-21 14:42:41 · 460 阅读 · 0 评论 -
阿里Java开发手册~并发处理
此静态变量 ,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象。使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资。3. 【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一。原创 2023-07-28 10:04:34 · 365 阅读 · 0 评论 -
阿里Java开发手册~集合处理
其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素。元素唯一的特性,可以快速对一个集合进行去重操作,避免使用。体现的是适配器模式,只是转换接口,后台的数据仍是数组。个元素,由于没有设置容量初始大小,随着元素不断增加,容。对原集合元素个数的修改,会导致子列表的遍历、增。把数组转换成集合时,不能使用其修改集合相关的方。【强制】使用集合转数组的方法,必须使用集合的。来接收返回的数据,此写法的泛型集合不能使用。带参方法,入参分配的数组空间不够大时,内部类,并没有实现集合的修改方法。原创 2023-07-28 09:58:59 · 715 阅读 · 0 评论 -
阿里Java开发手册~OOP 规约
判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,【强制】外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生。【推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,的成员变量,删除一下,不得手心冒点汗吗?视线内,变量作用域太大,如果无限制的到处跑,那么你会担心的。值,能够表示额外的信息,如:远程调用失败,异常退出。公有方法是类的调用者和维护者最关心的方法,首屏展示最好。17. 【推荐】循环体内,字符串的连接方式,使用。原创 2023-07-28 09:52:00 · 159 阅读 · 0 评论 -
阿里Java开发手册~代码格式
【推荐】方法体内的执行语句组、变量的定义语句组、不同的业务逻辑之间或者不同的语义。【推荐】没有必要增加若干空格来使某一行的字符与上一行对应位置的字符对齐。【强制】方法参数在定义和传入时,多个参数逗号后边必须加空格。【强制】大括号的使用约定。【强制】任何二目、三目运算符的左右两边都需要加一个空格。个空格,从第三行开始,不再继续缩进,参考示例。同样,右小括号和字符之间也不出现空格。【强制】 左小括号和字符之间不出现空格。都要增加几个空格,在变量比较多的。在多个参数超长,在逗号后换行。情况下,是一种累赘的事情。原创 2023-07-28 09:46:26 · 252 阅读 · 0 评论 -
阿里Java开发手册~常量定义
【推荐】不要使用一个常量类维护所有常量,应该按常量功能进行归类,分开维护。【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包。【推荐】如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。大而全的常量类,非得使用查找功能才能定位到修改的常量,不利于理解和维护。易懂变量也要统一定义成应用内共享常量,两位攻城师在两个类中分别定义了表示。子工程内部共享常量:即在当前子工程的。应用内共享常量:放置在一方库的。内共享常量、类内共享常量。类内共享常量:直接在类内部。原创 2023-07-28 09:41:27 · 131 阅读 · 0 评论 -
阿里Java开发手册~命名风格
【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。【强制】 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。【推荐】如果使用到了设计模式,建议在类名中体现出具体模式。【推荐】如果是形容能力的接口名称,取对应的形容词做接口名。形式,但是类名如果有复数含义,类名可以使用复数形式。【强制】杜绝完全不规范的缩写,避免望文不知义。的理念,暴露出来的服务一定是接口,内部。原创 2023-07-28 09:39:42 · 167 阅读 · 0 评论 -
阿里Java开发手册~日志规约
推荐对日志进行分类,如将错误日志和业务日志分开存放,便于开发人员查看,也便于。来记录刚上线时的业务行为信息,一定要注意日志输出量的问题,避免把服务器磁盘。,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。道日志文件属于什么应用,什么类型,什么目的,也有利于归类查找。日志级别来记录用户输入参数错误的情况,避免用户投诉时,无所适。方法,浪费了系统资源,执行了上述操作,最终日志却没有打印。,上述日志不会打印,但是会执行字符串拼接操作,如果。【强制】避免重复打印日志,浪费磁盘空间,务必在。原创 2023-07-27 17:08:05 · 776 阅读 · 0 评论 -
阿里Java开发手册~异常处理
【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的。随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副。【强制】异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。无法通过预检查的异常除外,如在解析一个外部传来的字符串形式数字时,通过。【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。原创 2023-07-27 16:56:06 · 341 阅读 · 0 评论 -
阿里Java开发手册~服务器
的发生是有概率的,甚至有规律地相隔数月才出现一例,出现时的现场信息对查错。的连接数太多,可能无法建立新的连接,所以需要在服务器上。连接采用与文件一样的方式去管理,即一个连接对。【推荐】调大服务器所支持的最大文件句柄数。错误,导致新的连接无法建立。维护不一致的问题和潜在的安全风险。状态的连接,在高并发访问下,服。服务器所支持的最大句柄数调高数倍。【推荐】高并发服务器建议调小。1024,当并发连接数很大时很。【参考】服务器内部重定向使用。主流操作系统的设计是将。服务器默认所支持最大。与服务器的内存数量相关。原创 2023-07-27 15:23:15 · 95 阅读 · 0 评论 -
阿里Java开发手册~二方库依赖
【强制】二方库里可以定义枚举类型,参数可以使用枚举类型,但是接口返回值不允许使用枚。【强制】依赖于一个二方库群时,必须定义一个统一的版本变量,避免版本号不一致。除非用户主动升级版本,否则公共二方库的行为不应该发生变化。进行查证,使版本号有延续性,正式版本号不允许覆盖升级。每个版本的变化应该被记录,二方库由谁维护,源码在哪里,都需要能。里只是声明版本,并不实现引入,因此子项目需要显式的声。【强制】二方库的新增或升级,保持除功能点之外的其它。里的依赖都会自动引入,并默认被所有的子项目继承。原创 2023-07-27 15:19:53 · 462 阅读 · 0 评论 -
阿里Java开发手册~应用分层
抛异常,因为已经处于顶层,无继续处理异常的方式,如果意识到这个异常将导致页面无法正常。渲染,那么就应该直接跳转到友好错误页面,加上友好的错误提示信息。【推荐】图中默认上层依赖于下层,箭头关系表示可直接依赖,如:开放接口层可以依赖于。:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。:数据查询对象,各层接收上层的查询请求。层,产生的异常类型有很多,无法用细粒度的异常进。层通用能力的下沉,如缓存方案、中间件通用处理。层处理一致,如果是单独部署,则采用与。开放接口,基础平台,其它公司的。原创 2023-07-27 15:15:58 · 314 阅读 · 0 评论 -
阿里Java开发手册~ORM 映射
要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。当返回参数,即使所有类属性名与数据库字段一一对应,也需。【强制】更新数据表记录时,必须同时更新记录对应的。作为查询的字段列表,需要哪些字段必须明确写明。【推荐】不要写一个大而全的数据更新接口,传入为。是与属性值对比的常量,一般是数字,表示相等时带。,会置入字段名和属性值,但是值的类型不可控。反过来,每一个表也必然有一个与之对应。生成的代码中,需要进行对应的修改。时,不要更新无改动的字段,一是易出错。类,不管是不是自己的目标更新字。原创 2023-07-27 15:06:44 · 164 阅读 · 0 评论 -
阿里Java开发手册~SQL 语句
【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。【强制】不得使用外键与级联,一切外键概念必须在应用层解决。【参考】如果有全球化需要,所有的字符存储与表示,均以。,有可能造成事故,故不建议在开发代码中使用此语句。操作能避免则避免,若实在避免不了,需要仔细评估。【强制】数据订正时,删除和修改记录时,要先。速度快,且使用的系统和事务日志资源少,但。标准统计行数的语法,跟数据库无关,跟。,那么即使另一列有不同的值,也返回为。应直接返回,避免执行后面的分页语句。,避免出现误删除,确认无误才能执。原创 2023-07-27 15:01:50 · 185 阅读 · 0 评论 -
阿里Java开发手册~索引规约
【强制】业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必。能够建立索引的种类:主键索引、唯一索引、普通索引,而覆盖索引是一种查询的一种。存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据。特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过。索引的一部分,并且放在索引组合顺序的最后,避免出现。原创 2023-07-27 11:19:23 · 352 阅读 · 0 评论 -
阿里Java开发手册~建表规约
【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检。【推荐】字段允许适当冗余,以提高查询性能,但必须考虑数据一致。商品类目名称使用频率高,字段长度短,名称基本一成不变,可在相关联的表中冗余存。【推荐】如果修改字段含义或对字段表示的状态追加时,需要及时更新字段注释。表名应该仅仅表示表里面的实体内容,不应该表示实体数量,对应于。在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不。,独立出来一张表,用主键来对应,避免影响其它字段索。【强制】表达是与否概念的字段,必须使用。原创 2023-07-27 11:04:49 · 235 阅读 · 0 评论 -
阿里Java开发手册~安全规约
【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制,【推荐】发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过。防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信。但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。【强制】用户请求传入的任何参数必须做有效性验证。内容、修改他人的订单。原创 2023-07-27 10:56:45 · 1225 阅读 · 0 评论 -
代码命名规范
日常编码中,代码的命名是个大的学问。能快速的看懂开源软件的代码结构和意图,也是一项必备的能力。那它们有什么规律呢?Java项目的代码结构,能够体现它的设计理念。Java采用长命名的方式来规范类的命名,能够自己表达它的主要意图。配合高级的IDE,可以减少编码人员的记忆负担,靠模糊的匹配就能找到自己所需要的资源。为了让大家更好的理解命名的套路,我借鉴了最流行的Java接开源软件(spring系列,netty,libgdx,guava,logback等等),总结了10类常见的类命名。原创 2023-05-04 09:49:24 · 1160 阅读 · 1 评论 -
代码精进之路~函数
实际上做了3件事:遍历所有雇员、检查是否该发工资、支付薪水。一个方法只做一件事情。使用Optional改造。原创 2022-12-28 21:14:37 · 120 阅读 · 0 评论 -
Effective Java~26. 不要使用 raw type
在编译完成之后尽快发现错误是值得的,理想情况是在编译时在泛型被添加到 Java 之前,这是一个典型的集合声明// Raw collection type - don't do this!// My stamp collection. Contains only Stamp instances.private final Collection stamps = ... ;如果你今天使用这个声明,然后不小心把 coin 实例放入你的 stamp 集合中,错误的插入编译和运行没有错误(尽管编译器原创 2022-02-07 10:47:26 · 434 阅读 · 0 评论 -
Effective Java~23. 类层次优于标签类
标签类,包含一个标签属性(tag field),表示实例的风格// Tagged class - vastly inferior to a class hierarchy!class Figure { enum Shape { RECTANGLE, CIRCLE }; // Tag field - the shape of this figure final Shape shape; // These fields are used only if shape is RECTANGLE原创 2022-02-07 10:02:28 · 576 阅读 · 0 评论 -
Effective Java~58. for-each 循环优先于传统的for 循环
传统的 for循环来遍历一个集合:// Not the best way to iterate over a collection!for (Iterator<Element> i = c.iterator(); i.hasNext(); ) {Element e = i.next(); ... // Do something with e}迭代数组的传统 for 循环的实例// Not the best way to iterate over an array!for原创 2022-01-28 17:16:20 · 593 阅读 · 0 评论 -
Effective Java~57. 将局部变量的作用域最小化
优先选择 for 循环而不是 while 循环例如,下面是遍历集合的首选方式// Preferred idiom for iterating over a collection or arrayfor (Element e : c) { ... // Do Something with e }如果需要在循环中调用 remove 方法,首选的习惯用法,使用传统的 for 循环代替 for-each循环:// Idiom for iterating when you need the原创 2022-01-28 17:09:47 · 595 阅读 · 0 评论 -
Effective Java~46. 优先选择Stream 中无副作用的函数
纯函数(pure function)的结果仅取决于其输入:它不依赖于任何可变状态,也不更新任何状态。坏味道// Uses the streams API but not the paradigm--Don't do this!Map<String, Long> freq = new HashMap<>();try (Stream<String> words = new Scanner(file).tokens()) { words.forEach(word原创 2022-01-27 14:46:39 · 530 阅读 · 0 评论 -
Effective Java~45. 谨慎使用Stream
在 Java 8 中添加了 Stream API,以简化顺序或并行执行批量操作的任务。 该 API 提供了两个关键的抽象:流(Stream),表示有限或无限的数据元素序列,以及流管道 (stream pipeline),表示对这些元素的多级计算。 Stream 中的元素可以来自任何地方。 常见的源包括集合,数组,文件,正则表达式模式匹配器,伪随机数生成器和其他流。流中的数据元素可以是对象引用或基本类型。 支持三种基本类型:int,long 和 double。流管道由源流(source stream)的零原创 2022-01-16 13:06:39 · 691 阅读 · 0 评论 -
Effective Java~44. 坚持使用标准的函数接口
在 java.util.Function 中有 43 个接口。不能指望全部记住它们,但是如果记住了六个基本接口,就可以在需要它们时派生出其余的接口。基本接口操作于对象引用类型。Operator 接口表示方法的结果和参数类型相同。Predicate 接口表示其方法接受一个参数并返回一个布尔值。Function 接口表示方法其参数和返回类型不同。Supplier 接口表示一个不接受参数和返回值 (或“供应”) 的方法。Consumer 表示该方法接受一个参数而不返回任何东西,本质上就是使用它原创 2022-01-16 12:42:17 · 159 阅读 · 0 评论 -
Effective Java~43. 方法引用优于Lambda
Java 提供了一种生成函数对象的方法,比 lambda 还要简洁,那就是:方法引用( method references)。下面是一段程序代码片段,它维护一个从任意键到整数值的映射。如果将该值解释为键的实例个数,则该程序是一个多重集合的实现。该代码的功能是,根据键找到整数值,然后在此基础上加1:map.merge(key, 1, (count, incr) -> count + incr);从 Java 8 开始, Integer 类(和所有其他包装数字基本类型)提供了一个静态方法总和,原创 2022-01-16 12:29:08 · 277 阅读 · 0 评论 -
Effective Java~42. Lambda 优于匿名类
在 Java 8 中,添加了函数式接口, lambda 表达式和方法引用,以便更容易地创建函数对象。下面是一段代码片段,按照字符串长度顺序对列表进行排序,使用匿名类创建排序的比较方法(强制排序顺序):// Anonymous class instance as a function object - obsolete!Collections.sort(words, new Comparator<String>() { public int compare(String...原创 2022-01-16 12:17:52 · 150 阅读 · 0 评论 -
Effective Java~38. 用接口模拟可扩展的enum
使用枚举类型有一个很好的方法来实现这种效果。基本思想是利用枚举类型可以通过为 opcode 类型定义一个接口,并实现任意接口。// Emulated extensible enum using an interfacepublic interface Operation { double apply(double x, double y);}public enum BasicOperation implements Operation { PLUS("+") { pu...原创 2022-01-15 22:08:27 · 197 阅读 · 0 评论 -
Effective Java~37. 用EnumMap 代替序数索引
有时可能会看到使用 ordinal 方法(条目 35)来索引到数组或列表的代码。 例如,考虑一下这个简单的类来代表一种植物:class Plant { enum LifeCycle { ANNUAL, PERENNIAL, BIENNIAL } final String name; final LifeCycle lifeCycle; Plant(String name, LifeCycle lifeCycle) { this.name = name; this.li...原创 2022-01-15 21:57:12 · 227 阅读 · 0 评论 -
Effective Java~36. 用EnumSet 代替位域
如果枚举类型的元素主要用于集合中,一般来说使用 int 枚举模式(条目 34),下面将 2 的不同倍数赋值给每个常量:// Bit field enumeration constants - OBSOLETE!public class Text { public static final int STYLE_BOLD = 1 << 0; // 1 public static final int STYLE_ITALIC = 1 << 1; // 2 pu...原创 2022-01-15 21:41:32 · 170 阅读 · 0 评论 -
Effective Java~35. 用实例域代替序数
许多枚举通常与单个 int 值关联。所有枚举都有一个 ordinal 方法,它返回每个枚举常量类型的数值位置。你可能想从序数中派生一个关联的 int 值:// Abuse of ordinal to derive an associated value - DON'T DO THISpublic enum Ensemble { SOLO, DUET, TRIO, QUARTET, QUINTET, SEXTET, SEPTET, OCTET, NONET, DECTET; public i原创 2022-01-15 21:31:11 · 188 阅读 · 0 评论 -
Effective Java~34. 用enum 代替 int 常量
在将枚举类型添加到该语言之前,表示枚举类型的常见模式是声明一组名为 int 的常量,每个类型的成员都有一个常量:// The int enum pattern - severely deficient! public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public st...原创 2022-01-15 21:24:44 · 144 阅读 · 0 评论 -
Effective Java~9. try-with-resource 优先于 try-catch
try-finally 语句是保证资源正确关闭的最佳方式,但是当添加多个资源时,情况会变糟// try-finally is ugly when used with more than one resource!static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOu原创 2022-01-14 14:53:17 · 237 阅读 · 0 评论 -
Effective Java~3. 私有Constructor 或Enum 强化单例
1、私有化构造器// Singleton with static factorypublic class Elvis { private static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public static Elvis getInstance() { return INSTANCE; } public void leaveTheBuilding() { ... }}可序列化原创 2022-01-14 14:43:34 · 152 阅读 · 0 评论 -
Effective Java~2.Builder代替多参数Constructor
Builder模式// Builder Patternpublic class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public static clas原创 2022-01-14 14:21:09 · 159 阅读 · 0 评论 -
Effective Java -- 思维导图
原创 2021-08-27 22:02:25 · 195 阅读 · 0 评论 -
代码精进之路--思维导图
原创 2021-08-27 21:57:16 · 532 阅读 · 0 评论