前言

我曾经是一名 .Net 开发,如今的我是一名 Java 开发者。在我享受着 Java 成熟的生态时,我常常怀念 c# 简洁的语法:自动属性、类型推断、自动初始化器 ....

鱼,我所欲也,熊掌亦我所欲也; 二者不可得兼;

直到我遇到了 lombok 。

添加依赖及 IDE 插件

maven 添加依赖:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven</artifactId>
<version>1.16.14.0</version>
</dependency>

因为 lombok 要在编译器编译时通过操作AST(抽象语法树)改变字节码生成,因此为了让 IDE 能够支持 lombok 需要给 IDE 添加相关插件,下面是 Idea 添加插件的方法:

使用

"Java的自动属性" -- @Getter & @Setter

Java 程序员在项目中不可避免的需要创建大量的 POJO , 在 POJO 中代码行数最多的就是我们不关心的 Getter 和 Setter 方法。虽然 IDE 可以帮助我们生成代码,但是冗长的代码看着还是很不爽。

看看 lombok 如何帮助我们简化代码:

public class User {
@Getter
@Setter
private String name;
@Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED)
private Integer age;
}

@Getter & @Setter 可以注解在类和属性上,放在类上,会对所有的非静态属性生成Getter&Setter方法,注解在属性上,会对该属性生成Getter&Setter方法。

并可以通过AccessLevel来设置Getter&Setter方法的访问级别。

"Java的类型推断" -- @val

很奇怪为什么 lombok 使用 val 而不是 跟 c# 一样使用 var ?因为 lombok 认为 java 后期可能会增加 var 这个关键字来支持类型推断,事实却是....

   @Test
public void valTest() {
val user = getUser();
user.setName("javaNoob");
System.out.println(user.getName());
} private User getUser(){
return new User();
}

没有"自动初始化器"的 java ,只能用构造函数 -- @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@NoArgsConstructor
@AllArgsConstructor
@RequiredArgsConstructor
public class User {
@Getter
@Setter
private String name;
@Getter(AccessLevel.PROTECTED)
@Setter(AccessLevel.PROTECTED)
private Integer age;
}

顾名思义:NoArgsConstructor 生成无参数构造函数,AllArgsConstructor 生成全部参数构造函数,RequiredArgsConstructor生成@NonNull注解字段的构造函数。

@NonNull 自动生成非空检查

对于 NullPointerException 异常 java 程序员应该再熟悉不过,@NonNull 注解就是帮我们生成Null检查。

    @NonNull
private String name;
@Test
public void valTest() {
val user = getUser();
user.setName(null);
System.out.println(user.getName());
}
/**
java.lang.NullPointerException: name
at com.github.javanoob.lombok.User.setName(User.java:11)
*/

相当于

    private void setName(String name) {
if (name==null){
throw new NullPointerException("name");
}
}

@Synchronized 将方法变成同步方法

    @Synchronized
private void syncMethod(){
System.out.println("I am synchronized");
}

相当于

    private static final Object $LOCK = new Object[0] ;
private void syncMethod(){
synchronized($LOCK) {
System.out.println("I am synchronized");
}
}

其他

@ToString 生成toString方法;@EqualsAndHashCode 帮你生成 equal()和 hashCode()方法。@Log 帮你生成日志相关代码。

也有一些比较鸡肋的 @Cleanup 感觉完全可以使用try-with-resource 来代替,还有 @SneakyThrows 个人感觉没什么使用场景。

总结

不知何时写 Java代码可以像C#一样爽

相关资料

  1. 官网 Feature List
  2. Github lombok 源码
  3. lombok原理分析

Lombok : 让你写 Java代码像C#一样爽的更多相关文章

  1. 写Java代码的一些小技巧

    写Java代码有三年多了,遇到过很多坑,也有一些小小的心得.特地分享出来供各位学习交流.这些技巧主要涉及谷歌Guava工具类的使用.Java 8新特性的使用.DSL风格开发.代码封装等技巧. 一.nu ...

  2. 关于JS里面写JAVA代码的问题

    最近做项目需要在JS脚本里面调用一个JAVA的函数得到数据,在网上查了很久,发现JS脚本里面不能写JAVA函数.只能把JS脚本里面的代码写进JSP文件里面的<script>标签内,然后写J ...

  3. Lombok - 消除冗长的 java 代码

    前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 ...

  4. myeclipse 写java代码提示 dead code 原因

    经常使用MyEclipse要么Eclipse编辑写java程序猿代码.您可能经常会遇到一个黄色警戒线:dead code:一般程序猿遇到这些问题都会置之不理,反正也不影响程序的编译运行.对,这不是bu ...

  5. 写java代码遇到的一些问题

    记录一些做论文实验写代码时遇到的问题. 数据库SQL语句方面: 1.java通过JDBC连接MySql数据库方法 参见:http://hzy3774.iteye.com/blog/1689525 2. ...

  6. jsp----在jsp中写java代码(变量和函数方法)

    <%@page import="java.text.SimpleDateFormat"%><%@page language="java" im ...

  7. 写Java代码分别使堆溢出,栈溢出

    首先要搞清楚堆栈里放的什么东西: 栈存储运行时声明的变量——对象引用(或基础类型, primitive)内存空间,堆分配每一个对象内容(实例)内存空间. 一个变量可以先后指向多个对象实例:数组.链表等 ...

  8. 用EditPlus和jdk写Java代码

    一.安装EditPlus EditPlus: https://www.editplus.com/latest4.html EditPlus注册码在线生成: https://www.jb51.net/t ...

  9. 写java代码有感。。。构造方法最好带着,

    (一) 小结:具体我最大的担心,害怕就是方法调用的时候,new对象之后,赋值,是在new后面的括号里实现,还是在 对象.方法名()这样的.当然带参数的构造方法,调用时本身就直接调用,普通方法,选后者. ...

随机推荐

  1. protocol error, got 'n' as reply type byte

    centos6.5上安装redis3.2版本,本地访问redis报错protocol error, got 'n' as reply type byte 解决办法 在redis配置文件redis.co ...

  2. BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)

    别人家的神选系列.Day2根本不能做QAQ 题目描述:给定两个字符串集合,一个长度为n,另一个为m,求有多少个数字对i,j,满足xi+yj能由一个(n+m)/2的字符串旋转拼接而成 我们枚举长度较长的 ...

  3. 如何发布第一个WP8.1程序(VisualStudio2015)

    学习WP开发有一段时间了,近一个月开始着手开发程序,并在开发程序中不断地学习(有一定的基础后,边开发程序,边学习是很好的,能练习运用所学的知识,并能在遇到问题后上网上资料不断地学习,很有效果,因为老是 ...

  4. 在 Windows 上测试 Redis Cluster的集群填坑笔记

    redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje       集群环境至少需要3个节点.推荐使用6个节点配置,即3个主节点,3个从节点. 新 ...

  5. Javascript定时器中的this指向

    使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题. 直接上例子: var name = 'my name is window'; var obj = ...

  6. 转:KVC与KVO机制

    由于Objective-C是基于Smalltalk进行设计的,所以它具有动态加载.动态绑定等特性.Key-value coding (KVC) 和 key-value observing (KVO) ...

  7. 自定义view(二)

    这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...

  8. vs2017 .net core WebApp 去掉ApplicationInsights

    vs2017新建的 .net core WebApp都内置了这个遥测中间件进去,嗯,用AZURE的话是不错能无缝支持.但不用AZURE就没什么用了. 为了不占地方和提高一点点初始启动的速度,对新建的项 ...

  9. Java面试05|MySQL及InnoDB引擎

    1.InnoDB引擎索引 InnoDB支持的索引有以下几种: (1)哈希索引 (2)全文索引 (1)B+树索引 又可以分为聚集索引与辅助索引 索引的创建可以在CREATE TABLE语句中进行,也可以 ...

  10. JAVA基础:求一个数组的中心元素