• Lombok : 让你写 Java代码像C#一样爽


    前言

    我曾经是一名 .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原理分析
  • 相关阅读:
    支付弹出窗口被拦截解决办法
    实现Bootstrap Carousel Fade Transition 淡入淡出效果
    SVN Global ignore pattern 忽略文件正则后缀
    css 不确定元素宽度的水平居中
    Android Studio运行程序,检测不到(夜神、Genymotion)模拟器
    HttpClient
    Eclipse中复制android项目后要改动的地方
    Eclipse快捷键
    Xml解析之PULL解析 例2
    Xml解析之PULL解析 例1
  • 原文地址:https://www.cnblogs.com/javanoob/p/lombok.html
Copyright © 2020-2023  润新知