如何编写更少,更好的代码,或Project Lombok

本文介绍Lombok项目如何通过自动生成getter、setter等代码减少Java开发者的负担,提高编码效率。使用Lombok,只需少量注解即可实现原本冗长的代码功能,如@Builder、@ToString、@EqualsAndHashCode等。

我长期以来一直打算撰写有关Lombok项目的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它。 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能增强工具并查看它们是否合适, Lombok肯定会通过允许同时编写更少的代码并添加到Java中来增强Java编码器的性能。它的质量,这不是小事。

Java反对者通常会说它的弱点是什么?

Java太冗长。
(c)每个Java对手

不幸的是,这句话有很多道理。 想象一下一个简单的数据类,您想要存储个人信息-名称,年龄等。它看起来可能像这样。

public class PersonSimple {
    private String lastName;
    private String firstName;
    private Integer age;

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public Integer getAge() {
        return age;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

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

好,你说。 我用IDE生成了所有这些东西,并不难。 但是我们还需要一个hashCode()equals() 。 因为您可能希望将实例保留在集合中并检查是否相等。 没问题,大多数IDE将允许您生成这些以及getter和setter。 它们将抛出toString()生成器,以帮助您输出对象并查看其中的内容。

public class PersonSimple {
    private String lastName;
    private String firstName;
    private Integer age;

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public Integer getAge() {
        return age;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PersonSimple that = (PersonSimple) o;
        return Objects.equals(lastName, that.lastName) &&
                Objects.equals(firstName, that.firstName) &&
                Objects.equals(age, that.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(lastName, firstName, age);
    }

    @Override
    public String toString() {
        return "PersonSimple{" +
                "lastName='" + lastName + '\'' +
                ", firstName='" + firstName + '\'' +
                ", age=" + age +
                '}';
    }
}

好吧。 所有这些东西都是由IntelliJ IDEA生成的。 这不是那么困难吧? 好吧 但是现在您正在考虑Josh Bloch并决定应用Builder模式 。 这次,您需要做一些手工工作。 最终您可能会得到的结果与此接近。

public class PersonSimple {
    private final String lastName;
    private final String firstName;
    private final Integer age;

    private PersonSimple(String lastName, String firstName, Integer age) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.age = age;
    }

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public Integer getAge() {
        return age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PersonSimple that = (PersonSimple) o;
        return Objects.equals(lastName, that.lastName) &&
                Objects.equals(firstName, that.firstName) &&
                Objects.equals(age, that.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(lastName, firstName, age);
    }

    @Override
    public String toString() {
        return "PersonSimple{" +
                "lastName='" + lastName + '\'' +
                ", firstName='" + firstName + '\'' +
                ", age=" + age +
                '}';
    }
    
    public static class Builder {
        private String lastName;
        private String firstName;
        private Integer age;

        public Builder setLastName(String lastName) {
            this.lastName = lastName;
            return this;
        }

        public Builder setFirstName(String firstName) {
            this.firstName = firstName;
            return this;
        }

        public Builder setAge(Integer age) {
            this.age = age;
            return this;
        }
        
        public PersonSimple build() {
            return new PersonSimple(lastName, firstName, age);
        }
     }
}

所以。 我们有一个生成器,现在我们的PersonSimple可以用这样的一段代码创建。

final PersonSimple john = new Person.Builder()
                .setFirstName("John")
                .setLastName("Doe")
                .setAge(30)
                .build();
        System.out.println(john);

但是您必须创建很多东西。 你有:

  • 具有全参数私有构造函数的数据类;
  • 数据类的三个获取器;
  • 带有三个二传手的伴随的建造者课程;
  • 生成器类上的build()方法,该方法调用私有数据类的构造函数;
  • 尽管生成了hashCode(),equals()和toString()方法,但不要忘记。

该代码现在需要70多行。 每次需要一个新字段时,都必须至少在三个地方进行处理:数据类中的getter,构建器类中的setter和构造函数。

如果我要向您展示如何对Lombok项目做同样的事情怎么办?

好,去

@Builder(toBuilder = true)
@ToString
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Person {
    @NonNull
    @Getter
    private final String lastName;
    @NonNull
    @Getter
    private final String firstName;
    @NonNull
    @Getter
    private final Integer age;
}
  • 我们使用@Builder注释生成了构建器类。 toBuilder = true意味着我们另外创建了一个toBuilder()实例方法,该方法创建一个builder类的新实例,并使用当前实例中的值进行初始化。
  • 我们添加了带有@ToString批注的toString()方法。
  • 我们添加了hashCode()equals()以及@EqualsAndHashCode
  • 我们使用@AllArgsConstructor(access = AccessLevel.PRIVATE)将所有参数的构造函数设为私有。
  • 我们使用@Getter注释在类字段中添加了标准的获取方法

现在是十五行代码。 十五! 我们只是将代码减少了五次。 对于具有很多领域的课程而言,收益会更好。

那么, Lombok计划到底做什么? 在编译期间生成所有样板 ,从而使您避免手动编写该代码或使用IDE生成它。 它为您节省了大量时间,并允许您以更少的精力创建更漂亮的代码。

将您的代码打包后,可以像这样创建人。

private static Person JOHN = Person.builder()
            .firstName("John")
            .lastName("Doe")
            .age(30)
            .build();

要将Lombok添加到您的项目中,您需要为其添加一个依赖项,在本例中,还需要为IDEA安装一个Lombok插件这里描述 Gradle配置, 这里描述 maven。

这里描述了Lombok的所有功能 。 请看一下是否还有其他有用的内容,因为我在这里描述的内容只是其中的一小部分。

来自示例的代码存储在我的github存储库中

祝您代码简洁明了!

翻译自: https://www.javacodegeeks.com/2018/01/write-less-better-code-project-lombok.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值