非常实用的Java工具类库

大家好,我是“猫玛尼”,一名程序员。

 

给大家强烈推荐一个非常实用的Java工具类库——Lombok,它可以有效地减少Java代码的冗长,让你的代码,看上去非常的简洁、优雅。

 

大家一般都是使用某个IDE(IDE是集成开发环境,它可以有效的提升我们的工作效率),来开发项目。要使用强大的Lombok,首先需要给你的IDE安装上相关的插件。

 

我平常用的是IntelliJ IDEA(下面都简称为IDEA),Lombok的安装步骤如下:

1、打开IntelliJ IDEA左上角的Preferences,选择Plugins,在搜索框中输入“Lombok”;

2、这个时候搜索结果里面可能没有,那就需要点击搜索结果里面蓝色字体的“Search in repositories”,就是通过在线仓库查找Lombok相关插件。点击超链接后,会弹出“Browse Repositories”在线搜索结果;

3、选中结果集中的“Lombok Plugin”,然后在右侧的插件介绍面板中点击“Install”,安装这个插件;

4、IDEA需要下载该插件,然后在后台安装,一般情况下都挺快的,一分钟不到吧。安装完成之后,刚才你点击的那个绿色的“Install”按钮,会变成“Restart IntelliJ IDEA”,点击这个按钮,重新启动IDEA,就OK了。我们可以去Plugins里面看一下,就能看到我们刚才安装的“Lombok Plugin”插件了。

 

安装好了插件,需要给项目引入Lombok依赖,可以直接下载Jar丢到你的项目里面,如果是Maven项目的话,可以在pom文件里面添加上依赖。我这边的例子是跑在Maven项目里的。

 

我一般是在

“https://mvnrepository.com/”这个中心仓库里面查找我想要的各种依赖。这个中心仓库东西很全。在中心仓库里面搜索“Lombok”,结果里的第一个就是,然后点进去选择具体的版本,我一般会选择使用最多的那个版本,这里是“1.18.2”:

 

把依赖文本复制到我们的pom.xml文件里面,然后“import Changes”,把依赖真正的加到我们项目里面去就OK了:

 

接下去就可以尽情的使用Lombok工具类库了。一个简单的例子如下:

 

 

看例子,能够很明显的感觉到,所写的代码非常简洁、清晰,少了大量的getter、setter、构造器等代码。

 

一般都是通过注解的方式使用Lombok,简单介绍一下常用的一些注解:

 

@Data注解:为Java类的所有字段生成getter、一个有用的toString方法和hashCode。还会为所有非final字段生成setter。该注解的作用等同于:@Getter、@Setter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode一起使用。

 

@Getter/@Setter注解:给相应的字段加上getter/setter方法,可以用在类或字段上。在类上面,标注这两个注解,表示该类中所有的非静态字段,都会生成相应的getter/setter方法;在字段上标注,则表示只给这个字段生成getter/setter方法,两者都有,则以标注在字段上优先。@Setter注解对final字段失效。

 

@ToString注解:只能标注在类上,给类生成一个具有一定可读性的toString()方法。

 

@NoArgsConstructor注解:给类生成一个无参构造器。

 

@AllArgsConstructor注解:给类生成一个包含所有字段的构造器。

 

@Builder注解:给类赋予了builder模式(建造者模式)。它可以解决字段很多的类重载多个构造器的繁琐,同时链式调用简化了类的构造。例子中“小码哥”那部分代码片段用到的就是这种模式。

 

@NonNull注解:可以标注在方法的参数上面。如果标注的这个参数,调用的时候传过来的值为null,则会抛出NPE(空指针异常),这样就不需要在代码中判空了,非常的方便。

 

@Log注解:可以给类添加一个日志对象log,使用的时候直接log.info("some info")就行,非常的方便。它使用的是Java自带的日志框架,该对象的类型是java.util.logging.Logger。

 

@Slf4j注解:它也用于记录日志,关于日志,我基本用的是这个注解。全称是simple logging facade for java,是Java的简单的日志门面。它不是具体的日志解决方案,它只服务于各种各样slf4j-logo的日志系统,比如Java自己的日志系统、Log4j、Log4j2、logback、JBossLog等,用Slf4j可以用统一的风格,编写日志代码。以后切换日志系统,也不需要修改任何代码。

 

还有其他的一些注解,我不太常用,大家有兴趣的也可以去研究一下,比如:@NonFinal、@PackagePrivate、@SuperBuilder、@Wither、@Singular、@Synchronized、@Value、@SneakyThrows等等,具体可以去官网查看他们的使用方法或直接在Jar包里面看代码。官网是:https://www.projectlombok.org/

 

有想法的开发者,可能会想,这一切,Lombok是怎么实现的呢?

 

万变不离其宗,就算工具在我们编写代码的这一步做了手脚,编译后的代码还是会还原最真实的面貌。编译后的代码,如下图:

 

package com.mmn.sum.example;

import java.util.ArrayList;
import java.util.List;

public class LombokUser {
    private String name;
    private Integer age;
    private List<String> hobby;

    public static void main(String[] args) {
        LombokUser anonymous = new LombokUser();
        System.out.println(anonymous);
        List<String> mmnHobby = new ArrayList();
        mmnHobby.add("打代码");
        LombokUser mmn = new LombokUser("猫玛尼", 27, mmnHobby);
        System.out.println(mmn);
        List<String> littleZHobby = new ArrayList();
        littleZHobby.add("吃东西");
        LombokUser littleZ = new LombokUser();
        littleZ.setAge(18);
        littleZ.setName("小张");
        littleZ.setHobby(littleZHobby);
        System.out.println(littleZ);
        LombokUser xmg = builder().age(36).name("小码哥").hobby(new ArrayList()).build();
        System.out.println(xmg);
    }

    public static LombokUser.LombokUserBuilder builder() {
        return new LombokUser.LombokUserBuilder();
    }

    public String getName() {
        return this.name;
    }

    public Integer getAge() {
        return this.age;
    }

    public List<String> getHobby() {
        return this.hobby;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof LombokUser)) {
            return false;
        } else {
            LombokUser other = (LombokUser)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label47: {
                    Object this$name = this.getName();
                    Object other$name = other.getName();
                    if (this$name == null) {
                        if (other$name == null) {
                            break label47;
                        }
                    } else if (this$name.equals(other$name)) {
                        break label47;
                    }

                    return false;
                }

                Object this$age = this.getAge();
                Object other$age = other.getAge();
                if (this$age == null) {
                    if (other$age != null) {
                        return false;
                    }
                } else if (!this$age.equals(other$age)) {
                    return false;
                }

                Object this$hobby = this.getHobby();
                Object other$hobby = other.getHobby();
                if (this$hobby == null) {
                    if (other$hobby != null) {
                        return false;
                    }
                } else if (!this$hobby.equals(other$hobby)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof LombokUser;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name = this.getName();
        int result = result * 59 + ($name == null ? 43 : $name.hashCode());
        Object $age = this.getAge();
        result = result * 59 + ($age == null ? 43 : $age.hashCode());
        Object $hobby = this.getHobby();
        result = result * 59 + ($hobby == null ? 43 : $hobby.hashCode());
        return result;
    }

    public String toString() {
        return "LombokUser(name=" + this.getName() + ", age=" + this.getAge() + ", hobby=" + this.getHobby() + ")";
    }

    public LombokUser() {
    }

    public LombokUser(String name, Integer age, List<String> hobby) {
        this.name = name;
        this.age = age;
        this.hobby = hobby;
    }

    public static class LombokUserBuilder {
        private String name;
        private Integer age;
        private List<String> hobby;

        LombokUserBuilder() {
        }

        public LombokUser.LombokUserBuilder name(String name) {
            this.name = name;
            return this;
        }

        public LombokUser.LombokUserBuilder age(Integer age) {
            this.age = age;
            return this;
        }

        public LombokUser.LombokUserBuilder hobby(List<String> hobby) {
            this.hobby = hobby;
            return this;
        }

        public LombokUser build() {
            return new LombokUser(this.name, this.age, this.hobby);
        }

        public String toString() {
            return "LombokUser.LombokUserBuilder(name=" + this.name + ", age=" + this.age + ", hobby=" + this.hobby + ")";
        }
    }
}

我们可以清楚的看到,编译后的代码,比原来多了很多的Getter、Setter,还有equals、LombokUserBuilder等。

 

我们做技术的,在个人能力没有触达的地方,可以通过强大的Google、Baidu来借助高人。

 

我翻阅了一些资料,原来 Lombok实现了JSR 269 API,即插入式注解处理API。它提供了一套标准API来处理Annotations,我们可以利用JSR 269提供的API来构建一个功能丰富的元编程(metaprogramming)环境。有兴趣的同学,可以自行深入研究。

 

用起来很简单,但是背后的设计思想还是很厉害的。

 

感谢高人,为我们提供了这么好的工具类库~

 

点赞是一种态度~感谢老铁!

 

【我平时的开发环境】

饭碗:Mac Pro 13寸

IDE:IntelliJ IDEA 2018

JDK:8

打包:Maven 3

 

欢迎围观公号《猫玛尼》

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值