范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java后端开发规范

  Java后端开发规范
  一、技术栈规约
  二、命名规范
  三、Java代码规范(注释规范、异常与日志、代码逻辑规范)
  四、Mybatis与SQL规范
  五、结果检查(单元测试及代码扫描)
  六、安全规范 一、技术栈规约
  二、命名规范命名使用英文词组合,严禁使用中文拼音或拼音首字母组合命名(专有名词例外) - OrganizationTreeNode, OrganizationVO ; 不推荐使用PSTree , Tlogs groupId,package包名前缀统一为: com.wiwj 包名第三位为产品分类名,如com.wiwj.cbs 常量命名全大写,单词间下划线分隔。如: DEFAULT_PAGE_SIZE 其他命名遵循驼峰式命名法:类名:首字母大写的UpperCamelCase,如: Organization方法名、变量名:首字母小写的lowerCamelCase,如: orgName 特定标识命名:领域模型增加类型后缀标识,如xxVO, yyDAO基类/抽象类使用Base/Abstract等前缀标识设计模式类添加Factory,Builder,Proxy等标识Controller, Service, Mapper统一添加到对应分层目录接口实现类添加Impl后缀标识枚举类添加Enum后缀标识CRUD接口采用统一前缀: get, count, create, delete, update, batchCreate … 三、Java代码规范  注释规范Java文件统一添加固定Header,通过IDE统一配置(code templates)  /** * 
  * @author mazhicheng@5i5j.com
  * @version 1.0
  * @date ${YEAR}/${MONTH}/${DAY}
  */接口和方法统一添加Java Doc标准注释 /** *缓存key-value并设定过期时间 * @param key 缓存对象的key * @param valueList 缓存对象 * @return 缓存是否成功 */  boolean addList(String key, List valueList);需暂留的弃用类/方法添加 @Deprecated 废弃标记 和 @see 链接指向新接口 * @see com.wiwj.common.cache.redis.JedisSentinelPoolUtil */ @Deprecated public class JedisUtils {…}异常与日志调用外部服务等可能异常的代码块,用 try/catch 代码块捕获并在catch中记录异常跟踪日志及业务逻辑处理 禁止吞掉异常信息
  禁止catch里不做任何记录和处理,吞掉异常及其堆栈信息
   禁止: logger.error("XXX操作异常") 或 logger.error("XXX操作异常"+e) 或 e.printStackTrace()
  正确:  logger.error("XXX操作异常", e) 对于非预期的条件,尽量增加else记录跟踪日志 禁止通过System.*.out()打印日志(单元测试例外) 日志记录logger需使用Slf4J代理声明,禁止绑死具体日志系统的API,避免后期更换日志组件导致代码的大量改动
  private static final Logger log = LoggerFactory.getLogger(OrganizationServiceImpl.class);
   如采用了lombok,可用 @Slf4j 注解替代以上声明。 对 trace/debug/info 级别的日志输出,必须使用占位符形式,避免直接String拼接异常信息(即使日志级别不匹配也会执行拼接操作空耗资源)。
  正确写法如: log.debug("当前用户id: {} ,操作对象: {}=>{} ", userId, objectType, objectId); 或条件输出形式如: if(log.isDebugEnabled()){ log.debug("当前用户id: "+id+" ,操作对象: "+ objectType +"=> "+ objectId); }逻辑代码规范废弃的/无用的代码一律直接删除,禁止以注释等方式保留 。如需查看历史代码,通过SVN/Git的history找回
  (无用的代码会干扰团队成员的阅读/或被误调,越积越多会导致代码维护成本增高) 接口类中的方法不需添加 public 修饰符 需要序列化的Bean类统一实现Serializable接口并用IDE生成serialVersionUID public class MyEntity implements Serializable {      private static final long serialVersionUID = 123456L;      ... }常用字符串统一定义在常量类里,如: "utf-8", "yyyyMMdd" 避免数字类型比较的坑: 统一采用equals进行比较其值,不用==进行比较,避免踩坑。 if/else/for/while语句后必须使用大括号,即使只有一行代码。(需求总是变化的,一行是暂时的) 嵌套层次过多的代码块利用反向思维缩减层次 方法单一职责: 单个方法代码行数控制在100行以内,超长的需要拆分(拆分成多个方法或类) 避免NPE(NullPointException)的一些建议: equals比较将非空对象前置:如 "true".equals(request.getParameter("isXx")),即使后者为空也不会导致NPE。 数据库字段可空的映射属性使用包装类型定义:如基本数据类型的int映射到数据库的null值将产生NPE,而用吧包装类型 Integer 则不会。 可能为空的变量进行必要判空,并在非预期条件下打印必要的跟踪日志,不但避免NPE,还非常便于跟踪调试。如: 级联调用 obj.getA().getB().getC() 易产生 NPE,先进行判空或使用 JDK8 的 Optional 类包装。 调用Dubbo接口拿到返回值时,进行判空。 封装统一的判空类用于常用类型的判空,代码需要判空时统一调用即可。如 XX.isEmpty(), XX.isNotEmpty() 遵循: Don’t Repeat Yourself,即 DRY 原则。避免进行简单的复制粘贴修改,当出现重复代码时思考是否封装
  当代码中存在大量重复代码时,一旦代码逻辑变动将很容易导致顾此失彼,产生bug,非常不利于维护。 Bean属性拷贝推荐用Spring BeanCopier或者Mapstruct,避免Apache BeanUtils或调用setter 禁止在循环中执行耗时的操作 ,如在循环中执行SQL语句/调用外部服务等// 错误的示例: for(Long id : idList){      // 循环执行SQL查询或调用外部系统接口,产生性能问题      Entity entity = xxService.getEntityById(id);      ... }  // 此案例的更优方案是 通过idList一次性查询获取到Entity集合,然后转换为Map供后续获取。需要多次使用的可复用对象将对象单独定义,禁止多次调用取不同属性。如: String name = userService.getUser(id).getName(); Long deptId = userService.getUser(id).getDepeId(); 替换为: User user = userService.getUser(id); String name = user.getName(), ….可异步执行的耗时操作采用异步处理:使用Spring @Async 或 MQ,或夜间Timer定时 常用数据考虑缓存,存入Redis,设置缓存过期时间 需要保证写一致性的逻辑,在外层方法上添加事务 @Transactional(rollbackFor = Exception.class) 四、Mybatis与SQL规范表名、字段名、索引等数据结构定义大小写: Oracle大写, MySQL小写。名称使用英文+下划线,并控制总长度,如 user_name。 表名建议采用"模块标识_"前缀,如 bas_user(如果模块库独立可省略模块名标识) 禁止程序中的SQL使用并行计算 /*+parallel(t,n)*/ SQL使用标准SQL,避免出现数据库特定的语法 未经评审不可直接使用视图、触发器、存储过程 SQL JOIN表数量不超过3张,超过3张表需要经过评审 (拆分成多次单表查询、主表冗余、程序绑定id-name映射、根据条件动态JOIN等)。 合理创建索引,并尽量避免不走索引的情况: 如LIKE右/任意匹配(‘%xx’, ‘%xx%’)不走索引, 换为"精确匹配="或固定前缀的左匹配’张%’不等条件(!=、<>、NOT)不走索引,应尽量避免(转换成IN/BETWEEN等)IS (NOT) NULL 不走索引,应尽量避免(如字段给定默认值,避免NULL)索引列使用函数或隐式转换都将导致索引失效,如 to_char(create_date,"yyyymmdd") = "20190102" 禁止手动拼接SQL语句,利用Mybatis等ORM框架的动态SQL实现。 参数使用#{} (避免${}产生SQL注入问题)。 禁止使用数据库处理函数 decode(),改为Java枚举或Map定义,通过id进行绑定 decode(client.TYPE, 1, "私客", 2, "店组公客", 3, "组团公客‘) 禁止动态拼接时强加 1=1 之类的写法,如WHERE 1=1。使用Mybatis动态SQL标签实现,如,, SQL中的参数类型确保与列定义一致,避免数据库隐式转换开销且无法使用索引,如:列定义为日期类型,参数要转换为Date日期类型进行比较: CREATE_TIME <= "2019-04-14 23:59:59’ CREATE_TIME <= to_date("2019-04-14 00:00:00","yyyy-MM-dd HH24:mi:ss’)列定义为数字类型,参数不用String DEPT_ID = "123’ ID主键自增的情况下,按create_time排序改为按ID排序,效果一样效率更高 五、检查结果后端服务及其他需要自测的代码,编写对应的单元测试类,统一采用Junit,禁止直接在原Java类中写main()方法自测。 单元测试会在打包前统一运行,可及时发现受影响的代码问题(比如新代码导致了之前的代码逻辑产生问题,如果有单元测试可在打包时及时发现) Junit单元测试类示例: public class TestApollo { @Test // 标记为单元测试方法 public void testApolloConfig(){ String appId = Foundation.app().getAppId(); // 预期结果断言 Assert.assertNotNull(appId); } }IDE中安装代码质量检查插件: FindBugs 及 Alibaba Java Coding Guidelines
  六、安全规约
  说明:本文限于篇幅,故而只展示部分的面试内容,完整的Java面试学习文档小编已经帮你整理好了,有需要的朋友点赞+关注私信我777免费领取Java、大厂面试学习资料哦!
  原文作者:地球其实挺好
  原文出处:https://www.cnblogs.com/zlt-blog/p/10839955.html

报废的电动汽车电池应该回收还是重新利用?到2020年底,估计每年将有102,000吨锂离子电池从电动汽车中淘汰,到2040年将增加到780万吨。这种指数级增长意味着必须考虑如何处理这些已淘汰的电池。电动汽车在世界范围内的这3款千元机你可别瞧不上,几乎无差评,很好用面对巨大的,潜力巨大的国内市场,许多品牌都在不断冲击着国内千元机市场。与难以获得的高价手机相比,千元手机大大降低了获得难度,非常适合过渡时期或学生和老年人使用。不要看不起这四千元以苹果13每日爆料,预计产量或比12mini下降,销量不佳带来连锁反应7月7日消息,据国外媒体报道,苹果公司的iPhone13系列的智能手机将于今年下半年,分析师和研究机构预计iPhone一样12日仍有四个模型,iPhone的屏幕大小12系列,这个名2K价位新选择!OPPOK9实力到底如何?光65W超闪就无敌了大家都知道,2021年是5G网络发展和普及的元年,市场上的5G智能手机也从以旗舰为主逐渐向中端市场普及,而上半年更是各大厂商发力中端5G手机的着重点。比如我们熟悉的国内一线大厂OPiPhone13外观确认刘海终于变窄,后置相机变大,更丑了毫不奇怪,今年的iPhone13系列看起来像这样。昨晚,国外媒体抢先曝光了iPhone13系列的真实机器渲染图,并表示该版本已经完成,这意味着将来不会有重大变化。该消息还指出,尽管iPhone13果粉的狂欢,这是你想要的外观配置吗iPhone12发布已经半年多了,想必大家的目光都转向了iPhone13,那么iPhone13做了哪些改动?首先我们来看看外观,新款iPhone还是采用了刘海屏的设计,与上一代刘海空降武汉!OPPOEncoPlay为何受SNH48成员推崇,这几点很重要5月8日下午,武汉市汉阳区摩尔城的OPPO官方授权体验店是热闹非凡,仔细一看,原来是OPPO请来了SNH48的部分成员空降武汉,担任一日店长,在现场我们不仅可以看到她们给粉丝和用户PC上的挖矿游戏可以赚钱吗?投资约9000元,一天赚15元币圈传出剧烈震荡。比特币和以太币几天前突然暴跌1020,卖出了300亿资金。但币圈的热情并没有消退,挖矿也停不下来,让游戏玩家吃尽了苦头,显卡价格被迫翻番。现在一张性能不错的游戏卡丰田高管固态电池技术将于2025年投产,15分钟就能充满电丰田原本计划在2020年东京奥运会上推出其固态电池供电的原型车,此后由于全球肺炎的影响,该原型车被推迟至2021年。丰田汽车公司动力总成部门执行副总裁兼电池部门总经理凯塔凯塔(Ke这一代的磷酸铁锂电池,会是特斯拉的关键利润所在吗?众所周知,特斯拉如今市值突破3000多亿美元,已经是两个丰田的价值了,是目前全球最大的汽车制造商。处于风口浪尖上的特斯拉,每做一件事都令人关注。今年特斯拉做了一个重要的决定,就是采荣耀Play系列的旗舰到底表现如何尼?荣耀Play4Pro作为荣耀Play系列的旗舰产品,到底有哪些亮点尼?先看看核心配置处理器麒麟990屏幕6。57英寸1080PLCD双挖孔屏指纹识别侧边指纹识别前置摄像头3200w
又是2999?摩托罗拉2亿像素新机正在量产,骁龙8Gen1Plus125W纵观摩托罗拉近一年来的表现,不少用户都表示,摩托罗拉真的很神似,新机的性价比相当高。其定价模式与其它手机厂商完全不同,堪称手机市场捣乱着。此前,不仅首发4纳米骁龙8Gen1芯片,售一加Ace竞速版正式发布,格局打开了5月17日,一加在线上正式发布了一加Ace竞速版,虽说名字是一加Ace,但却是套娃OPPOK10。不过这款手机是当做618特供机发布的,所以价格上应该会比K10更有下降空间(618苹果iOS15。5正式版推送有些小功能很实用iOS15。5和iPadOS15。5正式版来了,虽然相较于上一个版本都是一些小的调整,但也有一些实用和贴心的小变化,所有功能更新总结如下播客更新苹果播客Podcasts应用程序中新realme首款平板正式官宣徐起重磅IP联名即将登场或是火影忍者经过一段时间明里暗里的预热,日前,realme真我手机终于正式官宣了旗下首款平板电脑即将登场的消息。此外,同日,realme副总裁中国区总裁全球营销总裁徐起Chase也透露这款平板天玑8100骁龙7Gen1天玑1300,OPPO的性价比新机要来了这两个月的国内手机市场,真的太过于精彩了,接连发布了多款新机,而且与以往不一样的是,最近两月这些新机的性价比都挺高的,无论哪个品牌都没有给人高价低配的感觉,你唯一需要考虑的是品牌差AMDZen4Zen5SP6新接口曝光最多64核心AMD要全面换接口了。Zen4架构开始,桌面上的锐龙7000系列从AM4接口改为AM5,数据中心上的霄龙7004系列则从SP3接口改为SP5SP6。区别在于,SP5系列是高性能版本互联网时代下的数码产品,为人们提供了更方便的生活随着时代的发展,科技对生活的帮助作用越来越大,而我们的日常生活也越来越离不开科技,用心发现的话,其实我们生活中的数码产品,凝聚了不少科技的精华。而这些产品能够出现在人们的眼中,原因AR眼镜,通往元宇宙的入口近日,谷歌在AR领域又有了新进展谷歌在IO开发者大会上发布了对标Meta的AR眼镜。时隔多年,谷歌眼镜终于又出新品,而这一次,谷歌AR眼镜的宣传片的slogan是给世界加上字幕。从河南三大运营商默认关闭国际短信接收不知道大家有没有接到过类似这样00开头的电话?那这些电话都是什么情况呢?明确告诉大家,这些都是从境外打过来的诈骗电话!境外来电一般是00开头,手机一般会将归属地识别为境外国家和地区杨帆AI基础设施为其发展提供规模化高效率低成本的基础支撑5月17日,全新升级的2022搜狐科技峰会在北京盛大开幕,嘉宾规格创历届之最,活动内容的广度和深度实现重大突破。商汤科技联合创始人副总裁杨帆作为嘉宾,带来题为人工智能基础设施助推创一文带你入门网络协议1。目录网络协议HTTPHTTPS希望通过这篇文章能让读者了解什么是网络协议,以及目前我们最常接触的http和https。2。网络协议网络协议是为计算机网络中进行数据交换而建立的规