Lombok的主旨是提高开发效率,消除冗长的 JAVA 代码,尤其是 POJO 类型。在开发初期 POJO 经常修改,随之涉及到改动 getter/setter/toString 等一系列方法。虽然现在 IDE 都能自动生成对应代码,但还是需要手动删除重新生成。

它的原理是在编译期操作 AST(抽象语法树) 去改变字节码,根据注解生成对应的代码。因为在静态编译期做的,相对可控,使用也简单。

Google 开源的 AutoValue 也是用来解决这个问题,功能很全面,还可以定制化。但有一些的问题

  1. 代码侵入重,所有定义的对象是抽象类,使用都是封装后的 AutoValue_XXX
  2. 生成的 POJO 都是 immutable 的,需要频繁操作的类会很麻烦。
在使用 Lombok 期间遇到一个坑

当你的 POJO 中出现单字母驼峰名称时,例如:iType,Lombok生成出来的 getter/setter 方法

1
2
3
4
5
6
7
private String iType;
public String getIType() {
return iType;
}
public void setIType(String iType) {
this.iType = iType;
}

乍一看没啥问题,但是影响很严重,首先 Spring 是不认此方法的,其次也影响到 Jackson 的解析,直接导致无法使用

一般来说,代码规范和 API 规范有所区别,参考之前的文章「浅谈 Api 设计」。从后端输出 Api 时会做一些转换,例如驼峰转小写+下划线格式,这个 Jackson 有对应支持

1
2
3
4
5
6
Jackson2ObjectMapperBuilder.propertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)
//Jackson 也是通过 get 方法来获取属性
//我们的预期是
iType -> i_type
//而结果是
IType -> itype

开始我觉得这是 Lombok 的 bug,随后我下载了 Lombok 的源码来验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//HandlerUtil 类统一处理方法名
//可以看到规则是如果首字母小写,长度大于2并且第二个字母是大写或者是 titlecase 的话,则把首字母变大写。
/**
* @param prefix Something like {@code get} or {@code set} or {@code is}.
* @param suffix Something like {@code running}.
* @return prefix + smartly title-cased suffix. For example, {@code setRunning}.
*/
public static String buildAccessorName(String prefix, String suffix) {
if (suffix.length() == 0) return prefix;
if (prefix.length() == 0) return suffix;
char first = suffix.charAt(0);
if (Character.isLowerCase(first)) {
boolean useUpperCase = suffix.length() > 2 &&
(Character.isTitleCase(suffix.charAt(1)) || Character.isUpperCase(suffix.charAt(1)));
suffix = String.format("%s%s",
useUpperCase ? Character.toUpperCase(first) : Character.toTitleCase(first),
suffix.subSequence(1, suffix.length()));
}
return String.format("%s%s", prefix, suffix);
}

显然这是特意而为之,随后我上官方 issue 中看了下,在15年已经有人提出了这个问题,而官方的答复是 Java Bean 的规范就是如此,且不应该使用首字母小写第二个字符大写的命名规则,Spring 的处理方式是自己发明的,我们不能跟着 Spring 乱搞,如果 Oracle 官方推荐如此或者所有人都是这么处理的话我们才改~

虽然我没有仔细的看过 Bean 规范,但如果 Spring 这么大厂都不支持的话会很难推广,在我刚和同事推荐的时候大家都非常激动,一听有这么个坑几乎都放弃了,也许是 xXxx 这种命名非常常见吧,比如 iPhone……

不光 Spring,Jackson,编译器( IDEA)自动生成的也是如此,只能说 Lombok 性格真是倔。既然如此只好自己修改下源码了…

1
2
3
4
5
//好在改动也非常小, 规则改为:长度大于2,并且第二个字母是大写则不转换大写
boolean useUpperCase = suffix.length() > 2 && Character.isUpperCase(suffix.charAt(1));
suffix = String.format("%s%s", useUpperCase ? first : Character.toTitleCase(first),
suffix.subSequence(1, suffix.length()));

PS:据官方说从 JAVA 讨论组数据统计,半数多人支持 getxXxx() 的做法。但他们大多数人的选择未必是正确的做法~

啊呸…

北海道雪场非常多,二世谷、留寿都、札幌国际等诸多著名雪场,前年公司年会去的时候傻逼的被导游带去玩雪橇错过了留寿都的体验,据同事反馈也是相当的好。后面去了札幌国际玩了一天,体验也还不错。今年首次自带装备去滑雪,前期做了不少功课。

自带板的一些注意事项
  • 装备托运:滑雪板属于超规行李,需要特殊办理托运。事先了解航空公司对运动类大件物件的处理方式,国内航空一般把重量算在了普通行李中,部分国际航空公司有免费的政策
  • 酒店位置,背板的后果就是无法乘坐计程车, 所以酒店位置非常重要,距车站越近越好,当然价格会高一些。
  • 酒店往返雪场巴士时刻表

这次雪场的选择在 Kiroro二世谷中犹豫,由于没有订上雪场内的酒店,只能选择住在较近的小樽,这里去 Kiroro 大巴约50分钟。去二世谷要坐 JR 一个多小时。最终选择了较近的 Kiroro

这里必须要推荐下我选择的这家酒店,Dormy Inn Premium Otaru(小樽豪华多米酒店),就在 JR 小樽站对面,下车步行约1min。旁边是大巴站,隔壁是小樽最大的商场。 店内提供洗衣房及公共温泉,重点晚上还有免费拉面吃,哈哈。(偶然发现在札幌狸小路旁边也有一家)

KIRORO滑雪 (8 - 16点)

​ Kiroro雪场巴士有两种,一种免费的巴士到小樽驻港站,一种收费到达JR小樽站,都需要预约,因为座位有限,但基本坐不满。有一天我们只约到一个人,经过沟通也让我们上车了。小樽大巴早上八点十分出发,每日一班,不要迟到,不会等人。

Kiroro

​ 正逢圣诞节,雪场也搞了一些活动。在日本没有滑雪票的概念, 只有Lift price(缆车费) 和Rental price(租赁费用)。自带装备的话只需购买缆车费,根据年龄和时长价格不一,这次我们买的是3天联票(含夜场),折合人民币850左右,是不是比国内还便宜?

会发一张实名卡乘缆车用,印有你的个人信息,遇到问题能迅速找到你的资料,理论上只限本人使用。

Kiroro 雪场由两座山头组成,最长的雪道(Asari Dynamic) 4km 左右,覆盖初中高级雪道,也是人最多的雪道,缺点就是中午后雪就不粉了。我更爱的是最右侧的 Asari Course ,人烟稀少,大粉雪。

Asari 山顶雪季非常的美,像这样。

也可以这样

第一天下午四点左右暴风雪就开始来了,山顶雪雾大到戴着雪镜只能看到一片白茫茫,当时在高级道的我吓的不太敢滑,害怕冲到树林里的深雪堆里爬不出来。加上只穿了一件保暖内衣和软壳,感觉异常的冷~ 下山就收包返程了

Asari Course

吃饭逛街(18-21点)

​ 在小樽基本没有夜生活。六点多我们去觅食已经很多店关门了,有些出名的店还要预定,真是难死我们了~ 饭后就开启了买买买节奏

温泉&拉面(21-23点)

​ 运动一天后泡个温泉简直不能再爽,泡饿了再干它两碗免费拉面(拉面23点截止,千万别泡过头了)温泉图片就不放了….

​ 提示:女汤需要凭密码进入哦,密码每天都更换,记得找前台要。

最后遗憾

恰好那几天北海道遭遇大暴雪,缺点就是天气不好,也比较冷,好处是雪真是松软到不行,雪场下午都放弃压雪了,雪道内和野雪一样棉花糖似得脚感,趁最后一天天气晴朗拍了个视频,可惜已经没有棉花糖的雪了~

PS:在北海道遇到了几个热心的台湾人,解决了一些沟通问题,买 JR 函馆站的一位台湾姐姐带我们到售票厅中买到了更实惠的往返联程票,在雪场丢失了一台 wifi 设备也是一位台湾 MM 帮我们做了相关的登记(虽然最终也没有找回来)

信仰(英语:Faith)是指對一個人(同樣的對他的能力)、事物、神、宗教的教條或教導、沒有經驗證據的觀點(例如擁有強烈的政治信仰)抱有信心和信任 —wikipedia

如今「信仰」在网络上也被大家用来形容自己对某件事物的热爱,例如信仰是 Google,必须使用 Google 的全套服务,不论是否好用。手机要用亲儿子Nexus(即将变为 Pixel)。锤子的情怀、Apple 的果粉,都算是一种信仰。

今天收到了「信仰之盾」,其实是 Dota2 内的一款纪念品,每逢大比赛前会推出小本子供玩家购买,本子等级越高可以收获更多的饰品,不乏有一些极其珍惜的物品。当然想要本子等级高可以花更多的钱,今年的第六届国际邀请赛(最大的一场比赛,简称 Ti6)出了新的花样,达到 1000 级的玩家可以收获实体冠军盾一枚,这手段无非就是促使玩家买买买。

尽管知道是在「骗钱」,还是跳下了火坑,充值信仰。庆幸的是今年在大家心灰意冷的时候,一匹中国黑马拿到了久违的冠军,拿到史上最高奖励 $912w 约 6000 多万人民币,也算自己出了一份力。

Wings

实物上手图,我这批应该是九月第一批发货的。做工也还不错,比较精致但边缘有点瑕疵

正面

背面

透明隔层