学校网站的作用和意义,红酒购物网站源码,张家港外贸网站建设,有什么在线做文档的网站一、编程规约 #xff08;一#xff09;命名风格
不以下划线#xff08;_#xff09;或美元符号($)开始和结束不用中文拼音避免歧视或侮辱性词语类名用UpperCamelCase风格#xff0c;以下情况例外#xff1a;DO/PO/DTO等方法名、参数名、成员变量、局部变量使用lowerCam…一、编程规约 一命名风格
不以下划线_或美元符号($)开始和结束不用中文拼音避免歧视或侮辱性词语类名用UpperCamelCase风格以下情况例外DO/PO/DTO等方法名、参数名、成员变量、局部变量使用lowerCamelCase风格常量名称全部大写单词间用下划线分开抽象类命名用Abstract或Base开头异常类命命名使用Exception结尾类型与中括号紧挨相连来定义数组POJO类中的布尔类型变量不要加is前缀包名称同一使用小写点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式但是类名如果有复数含义可使用复数形式避免在子父类的成员变量之间、或者不同代码块的局部变量之间采取完全相同的命名使可理解性降低英文缩写要规范对于Service和DAO类暴露出来的服务一定时接口内部的实用类用Impl的后缀与接口区别命名可以使用完成的单词进行表达达到自解释目标常量和变量命名时表示类型的名词放在词尾命名时要体现出用到的具体设计模式接口类中的方法和属性不加任何修饰符枚举类名带上Enum枚举成员名词需要全大写单词间用下划线隔开各层命名规约 Service / DAO 层方法命名规约 获取单个对象的方法用 get 做前缀获取多个对象的方法用 list 做前缀复数结尾如listObjects获取统计值的方法用 count 做前缀插入的方法用 save / insert 做前缀删除的方法用 remove / delete 做前缀修改的方法用 update 做前缀 领域模型命名规约 数据对象xxxDOxxx 即为数据表名数据传输对象xxxDTOxxx 为业务领域相关的名称展示对象xxxVOxxx 一般为网页名称POJO 是 DO / DTO / BO / VO 的统称禁止命名成 xxxPOJO 二常量定义 代码中不要出现未经预先定义的常量long或Long赋值时数值后使用大写L浮点数类型的数值后缀统一为大写的D或F不要使用一个常量类维护所有常量要按功能分类常量的复用层次有五层跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量如果变量值仅在一个固定范围内变化用 enum 类型来定义 三代码格式大括号内为空简洁地写成{}左小括号和右边相邻字符之间不需要空格右小括号和左边相邻字符之间也不需要空格if / for / while / switch / do 等保留字与左右括号之间都必须加空格任何二目、三目运算符的左右两边都需要加一个空格采用 4 个空格缩进禁止使用 Tab 字符注释的双斜线与注释内容之间有且仅有一个空格在进行类型强制转换时右括号与强制转换值之间不需要任何空格隔开单行字符数限制不超过 120 个超出需要换行换行时遵循如下原则 第二行相对第一行缩进 4 个空格从第三行开始不再继续缩进运算符与下文一起换行方法调用的点符号与下文一起换行方法调用中的多个参数需要换行时在逗号后进行 方法参数在定义和传入时多个参数逗号后面必须加空格IDE 的 text file encoding 设置为 UTF-8IDE 中文件的换行符使用 Unix 格式不要使用Windows 格式单个方法总行数不超过80行无需对齐两行中的赋值等号不同逻辑、语义、业务的代码之间插入一个空行 四OOP规约使用类名访问静态变量和静态方法复写方法需要加Override注解相同参数类型相同业务含义才可以使用可变参数参数类型避免定义为Object外部正在调用的接口或者二方库依赖的接口不允许修改方法签名避免对接口调用方产生影响不能使用过时的类或方法Object 的 equals 方法容易抛空指针异常应使用常量或确定有值的对象来调用 equals所有整型包装类对象之间值的比较全部使用 equals 方法比较任何货币金额均以最小货币单位且为整形类型进行存储浮点数之间等值判断不能用或者equals进行判断BigDecimal 的等值比较应使用 compareTo 方法定义数据对象DO类时属性类型要与数据库字段类型相匹配禁止使用构造方法 BigDecimal(double) 的方法把double值转为为 BigDecimal 对象因为存在精度损失风险优先推荐入参为String的构造方法所有的POJO类属性必须使用包装数据类型RPC方法的返回值和参数必须使用包装数据类型定义 DO / PO / DTO / VO 等 POJO 类时不要设定任何属性默认值序列化类新增属性时请不要修改 serialVersionUID 字段避免反序列失败构造方法里面禁止加入任何业务逻辑初始化逻辑放在 init 方法中POJO 类必须写 toString 方法禁止在 POJO 类中同时存在对应属性 xxx 的 isXxx() 和 getXxx() 方法使用索引访问用 String 的 split 方法得到的数组时需做最后一个分隔符后有无内容的检查否则会有抛 IndexOutOfBoundsException 的风险当一个类有多个构造方法或者多个同名方法这些方法应该按顺序放置在一起便于阅读类内方法定义的顺序依次是公有方法或保护方法 私有方法 getter / setter 方法setter 方法中参数名称与类成员变量名称一致this.成员名参数名。在 getter / setter 方法中不要增加业务逻辑循环体内字符串的连接方式使用 StringBuilder 的 append 方法进行扩展final 可以声明类、成员变量、方法、以及本地变量下列情况使用 final 关键字 不允许被继承的类如String 类不允许修改引用的域对象如POJO 类的域变量不允许被覆写的方法如POJO 类的 setter 方法不允许运行过程中重新赋值的局部变量避免上下文重复使用一个变量使用 final 关键字可以强制重新定义一个变量方便更好地进行重构 慎用 Object 的 clone 方法来拷贝对象因为是浅复制类成员与方法访问控制从严 五日期时间日期格式化时传入 pattern 中表示年份统一使用小写的 y“yyyy-MM-dd HH:mm:ss”日期格式中的字母含义 表示月份是大写的 M表示分钟则是小写的 m24 小时制的是大写的 H12 小时制的则是小写的 h 获取当前毫秒数System.currentTimeMillis()而不是 new Date().getTime()不允许在程序任何地方中使用java.sql.Date、java.sql.Time、java.sql.Timestamp禁止在程序中写死一年为 365 天避免在公历闰年时出现日期转换错误或程序逻辑错误避免公历闰年 2 月问题使用枚举值来指代月份。如果使用数字注意 DateCalendar 等日期相关类的月份 month 取值范围从 0 到 11 之间 六集合处理关于 hashCode 和 equals 的处理遵循如下规则 只要覆写 equals就必须覆写 hashCode因为 Set 存储的是不重复的对象依据 hashCode 和 equals 进行判断所以 Set 存储的对象必须覆写这两种方法如果自定义对象作为 Map 的键那么必须覆写 hashCode 和 equals 判断所有集合内部的元素是否为空使用 isEmpty() 方法而不是 size() 0在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时一定要使用参数类型为 BinaryOperator参数名为 mergeFunction 的方法否则当出现相同 key 时会抛出IllegalStateException 异常在使用 java.util.stream.Collectors 类的 toMap() 方法转为 Map 集合时一定要注意当 value为 null 时会抛 NPE 异常ArrayList 的 subList 结果不可强转成 ArrayList否则会抛出 ClassCastException 异常java.util.RandomAccessSubList cannot be cast to java.util.ArrayList 说明subList() 返回的是 ArrayList 的内部类 SubList并不是 ArrayList 本身而是 ArrayList 的一个视图对于SubList 的所有操作最终会反映到原列表上 使用 Map 的方法 keySet() / values() / entrySet() 返回集合对象时不可以对其进行添加元素操作否则会抛出 UnsupportedOperationException 异常Collections 类返回的对象如emptyList() / singletonList() 等都是 immutable list不可对其进行添加或者删除元素的操作在 subList 场景中高度注意对父集合元素的增加或删除均会导致子列表的遍历、增加、删除产生 ConcurrentModificationException 异常使用集合转数组的方法必须使用集合的 toArray(T[] array)传入的是类型完全一致、长度为0 的空数组使用 Collection 接口任何实现类的 addAll() 方法时要对输入的集合参数进行 NPE 判断使用工具类 Arrays.asList() 把数组转换成集合时不能使用其修改集合相关的方法它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常泛型通配符? extends T来接收返回的数据此写法的泛型集合不能使用 add 方法而? super T不能使用 get 方法两者在接口调用赋值的场景中容易出错在无泛型限制定义的集合赋值给泛型限制的集合时在使用集合元素时需要进行instanceof 判断避免抛出 ClassCastException 异常不要在 foreach 循环里进行元素的 remove / add 操作。remove 元素请使用 iterator 方式如果并发操作需要对 iterator 对象加锁在 JDK7 版本及以上Comparator 实现类要满足如下三个条件不然 Arrays.sortCollections.sort 会抛 IllegalArgumentException 异常。说明三个条件如下 xy 的比较结果和 yx 的比较结果相反x yy z则 x zx y则 xz 比较结果和 yz 比较结果相同 泛型集合使用时在 JDK7 及以上使用 diamond 语法或全省略集合初始化时指定集合初始值大小使用 entrySet 遍历 Map 类集合 KV而不是 keySet 方式进行遍历高度注意 Map 类集合 K / V 能不能存储 null 值的情况: 集合类 Key Value Super 说明 Hashtable 不为null 不为null Dictionary 线程安全 TreeMap 不为null 可为null AbstractMap 线程不安全 ConcurrentHashMap 不为null 不为null AbstractMap 锁分段技术JDK8:CAS HashMap 可为null 可为null AbstractMap 线程不安全合理利用好集合的有序性sort和稳定性order避免集合的无序性unsort和不稳定性unorder带来的负面影响利用 Set 元素唯一的特性可以快速对一个集合进行去重操作避免使用 List 的contains() 进行遍历去重或者判断包含操作 七并发处理获取单例对象需要保证线程安全其中的方法也要保证线程安全创建线程或线程池时请指定有意义的线程名称方便出错时回溯线程资源必须通过线程池提供不允许在应用中自行显式创建线程线程池不允许使用 Executors 去创建而是通过 ThreadPoolExecutor 的方式这样的处理方式让写的同学更加明确线程池的运行规则规避资源耗尽的风险SimpleDateFormat 是线程不安全的类一般不要定义为 static 变量如果定义为 static必须加锁或者使用 DateUtils 工具类必须回收自定义的 ThreadLocal 变量记录的当前线程的值尤其在线程池场景下线程经常会被复用如果不清理自定义的 ThreadLocal 变量可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代码中使用 try-finally 块进行回收高并发时同步调用应该去考量锁的性能损耗。能用无锁数据结构就不要用锁能锁区块就不要锁整个方法体能用对象锁就不要用类锁对多个资源、数据库表、对象同时加锁时需要保持一致的加锁顺序否则可能会造成死锁在使用阻塞等待获取锁的方式中必须在 try 代码块之外并且在加锁方法与 try 代码块之间没有任何可能抛出异常的方法调用避免加锁成功后在 finally 中无法解锁在使用尝试机制来获取锁的方式中进入业务代码块之前必须先判断当前线程是否持有锁。锁的释放规则与锁的阻塞等待方式相同并发修改同一记录时避免更新丢失需要加锁。要么在应用层加锁要么在缓存加锁要么在数据库层使用乐观锁使用 version 作为更新依据多线程并行处理定时任务时Timer 运行多个 TimeTask 时只要其中之一没有捕获抛出的异常其它任务便会自动终止运行使用 ScheduledExecutorService 则没有这个问题资金相关的金融敏感信息使用悲观锁策略使用 CountDownLatch 进行异步转同步操作每个线程退出前必须调用 countDown 方法线程执行代码注意 catch 异常确保 countDown 方法被执行到避免主线程无法执行至 await 方法直到超时才返回结果避免 Random 实例被多线程使用虽然共享该实例是线程安全的但会因竞争同一 seed 导致的性能下降通过双重检查锁double-checked locking实现延迟初始化需要将目标属性声明为volatile 型volatile 解决多线程内存不可见问题对于一写多读是可以解决变量同步问题但是如果多写同样无法解决线程安全问题HashMap 在容量不够进行 resize 时由于高并发可能出现死链导致 CPU 飙升在开发过程中注意规避此风险ThreadLocal 对象使用 static 修饰ThreadLocal 无法解决共享对象的更新问题 八控制语句在一个 switch 块内每个 case 要么通过 continue / break / return 等来终止要么注释说明程序将继续执行到哪一个 case 为止在一个 switch 块内都必须包含一个 default 语句并且放在最后即使它什么代码也没有当 switch 括号内的变量类型为 String 并且此变量为外部参数时必须先进行 null 判断在 if / else / for / while / do 语句中必须使用大括号三目运算符 condition ? 表达式 1表达式 2 中高度注意表达式 1 和 2 在类型对齐时可能抛出因自动拆箱导致的 NPE 异常在高并发场景中避免使用“等于”判断作为中断或退出的条件当方法的代码总行数超过 10 行时return / throw 等中断逻辑的右大括号后需要加一个空行表达异常的分支时少用 if-else 方式除常用方法如 getXxx / isXxx等外不要在条件判断中执行其它复杂的语句将复杂逻辑判断的结果赋值给一个有意义的布尔变量名以提高可读性不要在其它表达式尤其是条件表达式中插入赋值语句循环体中的语句要考量性能以下操作尽量移至循环体外处理如定义对象、变量、获取数据库连接进行不必要的 try-catch 操作这个 try-catch 是否可以移至循环体外避免采用取反逻辑运算符公开接口需要进行入参保护尤其是批量操作的接口 九注释规范类、类属性、类方法的注释必须使用 Javadoc 规范使用 /** 内容 */ 格式不得使用 // xxx方式所有的抽象方法包括接口中的方法必须要用 Javadoc 注释、除了返回值、参数异常说明外还必须指出该方法做什么事情实现什么功能所有的类都必须添加创建者和创建日期方法内部单行注释在被注释语句上方另起一行使用 // 注释。方法内部多行注释使用 /* */注释注意与代码对齐所有的枚举类型字段必须要有注释说明每个数据项的用途可用中文注释说清楚专有名词与关键字保持英文原文即可代码修改的同时注释也要进行相应的修改尤其是参数、返回值、异常、核心逻辑等在类中删除未使用的任何字段和方法、内部类在方法中删除未使用的参数声明与内部变量谨慎注释掉代码。在上方详细说明而不是简单地注释掉。如果无用则删除对于注释的要求第一、能够准确反映设计思想和代码逻辑第二、能够描述业务含义使别的程序员能够迅速了解到代码背后的信息好的命名、代码结构是自解释的注释力求精简准确、表达到位。避免出现注释的另一个极端过多过滥的注释代码的逻辑一旦修改修改注释又是相当大的负担免出现注释的另一个极端过多过滥的注释代码的逻辑一旦修改修改注释又是相当大的负担特殊注释标记请注明标记人与标记时间。注意及时处理这些标记通过标记扫描经常清理此类标记 十前后端规约前后端交互的 API需要明确协议、域名、路径、请求方法、请求内容、状态码、响应体 协议生产环境必须使用 HTTPS路径每一个 API 需对应一个路径表示 API 具体的请求地址 代表一种资源只能为名词推荐使用复数不能为动词请求方法已经表达动作意义URL 路径不能使用大写单词如果需要分隔统一使用下划线路径禁止携带表示请求内容类型的后缀比如.json“.xml”通过 accept 头表达即可 请求方法对具体操作的定义常见的请求方法如下 GET从服务器取出资源。POST在服务器新建一个资源。PUT在服务器更新资源。DELETE从服务器删除资源。 请求内容URL 带的参数必须无敏感信息或符合安全要求body 里带参数时必须设置 Content-Type。响应体响应体 body 可放置多种数据类型由 Content-Type 头来确定 前后端数据列表相关的接口返回如果为空则返回空数组[]或空集合{}服务端发生错误时返回给前端的响应信息必须包含 HTTP 状态码errorCode、errorMessage、用户提示信息四个部分在前后端交互的 JSON 格式数据中所有的 key 必须为小写字母开始的 lowerCamelCase风格符合英文表达习惯且表意完整errorMessage 是前后端错误追踪机制的体现可以在前端输出到 type“hidden” 文字类控件中或者用户端的日志中帮助我们快速地定位出问题对于需要使用超大整数的场景服务端一律使用 String 字符串类型返回禁止使用 Long 类型HTTP 请求通过 URL 传递参数时不能超过 2048 字节HTTP 请求通过 body 传递内容时必须控制长度超出最大长度后后端解析会出错在翻页场景中用户输入参数的小于 1则前端返回第一页参数给后端后端发现用户输入的参数大于总页数直接返回最后一页服务器内部重定向必须使用 forward外部重定向地址必须使用 URL 统一代理模块生成否则会因线上采用 HTTPS 协议而导致浏览器提示“不安全”并且还会带来 URL 维护不一致的问题服务器返回信息必须被标记是否可以缓存如果缓存客户端可能会重用之前的请求结果服务端返回的数据使用 JSON 格式而非 XML前后端的时间格式统一为yyyy-MM-dd HH:mm:ss统一为 GMT在接口路径中不要加入版本号版本控制在 HTTP 头信息中体现有利于向前兼容 十一其他在使用正则表达式时利用好其预编译功能可以有效加快正则匹配速度避免用 ApacheBeanutils 进行属性的 copyvelocity 调用 POJO 类的属性时直接使用属性名取值即可模板引擎会自动按规范调用 POJO的 getXxx()如果是 boolean 基本数据类型变量boolean 命名不需要加 is 前缀会自动调 isXxx()后台输送给页面的变量必须加 $!{var} ——中间的感叹号注意 Math.random() 这个方法返回是 double 类型注意取值的范围 0 ≤ x 1能够取到零值注意除零异常如果想获取整数类型的随机数不要将 x 放大 10 的若干倍然后取整直接使用 Random 对象的 nextInt 或者 nextLong 方法枚举 enum括号内的属性字段必须是私有且不可变不要在视图模板中加入任何复杂的逻辑运算任何数据结构的构造或初始化都应指定大小避免数据结构无限增长吃光内存及时清理不再使用的代码段或配置信息 添加评论