1.[强制] 在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。
说明: 不要在方法体内定义: Pattern pattern = Pattern.compile(规则);
老四附言:
Pattern和Matcher同属于java.util.regex类库,通过使用正则表达式解决一些String对象很难解决的字符串难题。
1 2 |
// 直接返回true/false就好 Pattern.compile("^1[\\d]{10}$").matcher(mobiles).matches(); |
2.[强制] velocity调用POJO类的属性时,建议直接使用属性名取值即可,模板引擎会自动按规范调用POJO的getXxx(),如果是boolean基本数据类型变量(boolean命名不需要加is前缀),会自动调用isXxx()方法。
说明: 注意如果是Boolean包装类对象,优先调用getXxx()的方法。
老四附言:
老四其实没用过velocity模板引擎,所以不敢多写。记得在《Spring4 实战》中看过一部分关于velocity的内容:
Apache Velocity是由Apache提供的通用模板引擎,Velocity 有挺长的历史了,并且已经应用于各种任务中,包括代码生成以及代替JSP.它还能用于格式化富文本 Email消息。Spring提供了一个名为VelocityEngineFactoryBean的工厂bean,它能够在 Spring 应用上下文中很便利地生成VelocityEngine。Spring自带了VelocityEngineUtils来简化将Velocity模板与模型数据合并成String的工作。
VelocityEngineFactoryBean的声明如下:
1 2 3 4 5 6 7 8 9 10 11 |
@Bean public VelocityEngineFactoryBean velocityEngine() { VelocityEngineFactoryBean velocityEngine = new VelocityEngineFactoryBean(); Properties velocityProperties = new Properties(); velocityProperties.put("resource.loader", "class"); velocityProperties.put("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); velocityEngine.setVelocityProperties(velocityProperties); return velocityEngine; } |
更多关于Velocity模板引擎可以参考Apache Velocity官方文档、Velocity维基百科或者并发编程网ifeve的大佬们翻译的apache-velocity-dev中文版本。
3.[强制] 后台输送给页面的变量必须加$!{var}—-中间的感叹号。
说明: 如果var=null或者不存在,那么${var}会直接显示在页面上。
老四附言:
这个貌似说的也是velocity模板引擎,详情可以参考一下这个帖子《Velocity中$和$!的区别》
4.[强制] 注意Math.random()这个方法返回是double类型,注意取值的范围0≤x<1(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法。
老四附言:
正确的随机取整:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.glorze.oop; import java.time.Instant; import java.util.Random; /** * 不要将Math.random()放大10的若干倍然后取整 * @ClassName RandomTest * @author: glorze.com * @since: 2018年7月17日 下午11:03:34 */ public class RandomTest { public static void main(String[] args) { Random random = new Random(); // 随机整数中不包含888 int glorze = random.nextInt(888); long gaolaosi = random.nextLong(); System.out.println("生成随机整数: " + glorze); System.out.println("================"); System.out.println("生成随机Long型整数: " + gaolaosi); } } |
输出结果:
生成随机整数: 611
================
生成随机Long型整数: 1991297349226189494
5.[强制] 获取当前毫秒数System.currentTimeMillis();而不是new Date().getTime();
说明: 如果想获取更加精确的纳秒级时间值,使用System.nanoTime()的方式。在JDK8中,针对统计时间等场景,推荐使Instant类。
简单介绍一下java8中的Instant类:
我们都知道,JDK中的时间类一直以来为我们所诟病,总是存在的诸多不足和处理起来麻烦的地方。比如说Calendar类线程不安全且不支持时区,计数TM还是从0开始。格式化日期的类竟然还需要到Java.text中创建SimpleDateFormat实例。
可能真的官方自己都看不下去了,java8又㕛叒叕新增了关于时间的API,我们从这个API可以看到Joda-Time框架的影子,据说Joda-Time的作者倡导了这次jdk8新的日期API。官网现在已经更新了,详情请戳Joda-Time官网。
Java8中的日期和时间类包含LocalDate、LocalTime、Duration、Period以及Instant。其余几个姑且不谈,我们就来说一下这个Instant,如孤尽所言,他其实和System.currentTimeMillis()有点类似,区别于Duration表示的是一个时间点,但是人家是精确到纳秒级别的,这个就精准了。可以使用ofEpochSecond()方法创建实例,通过now()类方法直接获得当前时间戳。直接看个简单的例子吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.glorze.oop; import java.time.Instant; /** * Instant获取精准时间戳 * @ClassName InstantTest * @author: glorze.com * @since: 2018年7月18日 下午1:21:05 */ public class InstantTest { public static void main(String[] args) { // 当前时间戳 Instant now = Instant.now(); System.out.println("当前时间戳: " + now); // ofEpochSecond方法中第一参数代表从1970-01-01 00:00:00到现在的秒数,第二个代表纳秒数 Instant instant = Instant.ofEpochSecond(8888888888l, 100000); } } |
6.[推荐] 不要在视图模板中加入任何复杂的逻辑。
说明: 根据MVC理论,视图的职责是展示,不要抢模型和控制器的活。
老四附言:
再者说也不安全 不是吗?
7.[推荐] 任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。
老四附言:
来来来,复习的时间。ArrayList的默认初始化容量是多少,HashMap的默认出事容量是多少?
8.[推荐] 任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存。
说明: 对于垃圾代码或过时配置,坚决清理干净,避免程序过度臃肿,代码冗余。
正例: 对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。
老四附言:
emmmmmmmm~~ 养成良好编码的好习惯。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额,抱拳。赞助时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的赞赏钱财也会被用于小站的服务器运维上面,再次抱拳。