【小家java】java5新特性(简述十大新特性) 重要一跃
【小家java】java6新特性(简述十大新特性) 鸡肋升级
【小家java】java7新特性(简述八大新特性) 不温不火
【小家java】java8新特性(简述十大新特性) 饱受赞誉
【小家java】java9新特性(简述十大新特性) 褒贬不一
【小家java】java10新特性(简述十大新特性) 小步迭代
【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本
无规矩不成方圆 无规范不能协作
对于编码规范,本人一直是公司里的大力推崇者。其实不乏发现有很多人并不注重编码的规范性,觉得只要功能实现了就ok了,其实这种认识是非常初级的。
了解了规范,可以提前避免一些开发盲区,大大提高团队协作的效率。规范的编程习惯,更能提升我们coder的职业素养,向代码致敬
一个成熟的项目要想长足发展(其实我还没看过什么项目只考虑work几个月就够了的),后期维护成本是设计者不得不做长远设计和考虑的
阿里巴巴作为国内Java行业的领头羊,各个领域都具有极高的发言权和权威。2017年开春之际,阿里诚意献上重磅大礼:《阿里巴巴Java开发手册》,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本。
引用书上的一句话:
很多编程方式客观上没有对错之分,一致性很重要,可读性很重要,团队沟通效率很重要。程序员天生需要团队协作,而协作的正能量要放在问题的有效沟通上。个性化应尽量表现在系统架构和算法效率的提升上,而不是在合作规范上进行纠缠不休的讨论、争论,最后没有结论。
作者(孤尽)在知乎回答的一句话:
翻完了不代表记住了,记住了不代表理解了,理解了不代表能够应用上去,真正的知识是实践,实践,实践。
北京的冬天外面非常的冷,所以有个周末,天气阴沉沉的,比较适合在室内呆着。看看我的书籍,才发现当时618买了一堆书,这堆书还有没撕包装的呢(其实有好几本书还是全新的呢)….于是我翻出了最薄的一本《阿里巴巴 Java开发手册》:
说明:
**我认为**
比较重要,或者说是我之前开发时没有注意到的一些规范(知识点)。如果你的变量名带is的话,比如isActive,框架解析的时候可能就当成active了。
简单的说就是0是有意义的,而很多时候我们只想表达null,那基本类型就无能为力了(局部变量有基本类型是因为我清楚意义,效率稍微高那么一点点)
如果set/get方法放入业务逻辑,有时候排查问题就变得很麻烦了
keySet遍历了两次,一次是转成Iterator对象,一次是从hashMap中取出key所对应的value,如果JDK8可以使用Map.foreach方法
其实在源码里边我们可以发现,forEach实际上就是封装了entrySet,提供forEach给我们可以更加方便地遍历Map集合
// forEach源码
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch(IllegalStateException ise) {
// this usually means the entry is no longer in the map.
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
如果是JDK8应用,可以使用Instant(针对时间统计等场景)代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat
下面这么使用SimpleDateFormat ,就不会有线程安全问题了
// 1. 在方法内部使用,没有线程安全问题
private static final String FORMAT = "yyyy-MM-dd HH:mm:ss";
public String getFormat(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT);
return dateFormat.format(date);
}
// 2. 每次使用的时候加锁
private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void getFormat(){
synchronized (SIMPLE_DATE_FORMAT){
SIMPLE_DATE_FORMAT.format(new Date());
….;
}
// 3. 使用ThreadLocal,每个线程都有自己的SimpleDateFormat对象,互不干扰
private static final ThreadLocal<DateFormat> DATE_FORMATTER = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
// 4. 使用DateTimeFormatter(This class is immutable and thread-safe.)
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(timeFormatter.format(LocalDateTime.now()));
在JDK7之后,可以直接使用API ThreadLocalRandom,而在JDK7 之前,需要编码保证每个线程持有一个实例。
充分利用好最左前缀匹配特性!
MySQL并不是跳过 offset行,而是取 offset+N行,然后返回放弃前offset行,返回N行,那当 offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。
按照这么建议,我们这样来优化我们的sql语句:
// 优化前
SELECT id, cu_id, name, info, biz_type
, gmt_create, gmt_modified, start_time, end_time, market_type
, back_leaf_category, item_status, picuture_url
FROM relation
WHERE biz_type = '0'
AND end_time >= '2014-05-29'
ORDER BY id ASC
LIMIT 149420, 20;
// 优化后
SELECT a.*
FROM relation a, (
SELECT id
FROM relation
WHERE biz_type = '0'
AND end_time >= '2014-05-29'
ORDER BY id ASC
LIMIT 149420, 20
) b
WHERE a.id = b.id
解释:其实这里就是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。这样就是充分利用了索引!
12. 如果有全球化需要,均以utf-8编码。如果需要存储表情,选择utf8mb4进行存储。
由于时间有限,今天重点就自己实施验证了上面一些例子,关于其它的,后续有空还会补充完整这篇博文的。
借用灰太狼一句名言:我一定会回来的
阿里手册已经涉及到的,此处不再提了。本处仅提出个人的一些建议,不喜勿喷
仅代表着我个人的意见,我觉得OK的地方。大家如果觉得好的话,可以帮顶,如果大家对我个人提出的规范有什么想法和建议,非常非常欢迎提出来或者指正,毕竟我个人的经验还不是很足,需要指点、优化。
能约定好的规范,就不要多写一个适配器去兼容
Author | A哥(YourBatman) |
---|---|
个人站点 | www.yourbatman.cn |
[email protected] | |
微 信 | fsx641385712 |
活跃平台 |
|
公众号 | BAT的乌托邦(ID:BAT-utopia) |
知识星球 | BAT的乌托邦 |
每日文章推荐 | 每日文章推荐 |