注释。第 1 部分 — 有点无聊
在这一部分中,我决定接触一下 Lombok 库,因为它是源代码注释的著名代表。我将在下一篇文章中讨论运行时注释。 从前,有一个Java程序员。她每天都会写普通的代码,比如这样:
package lombok;
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
这个类很普通——只有2个字段(毕竟,有时会有超过10-15个字段)。当然,这一切都可以在IDE中生成。但该死的,它取代了它的位置。如果有 15-20 个字段,每个字段都需要 getter、setter、constructor...在所有这些中,还有一些肉眼看不见的其他方法很容易丢失。我们如何帮助这位程序员写得更快、更少?龙目岛。与你一起出油锅,一起入火。这是同一个类,但现在我们使用 Lombok:
package lombok;
@Data
public class Person {
private String name;
private int age;
}
就这样。很酷吧?@Data注解有什么作用?在编译期间,此注释会为所有字段生成 getter/setter,并根据标准规则覆盖 toString()、equals() 和 hashCode()。您可以在 IDE 中安装该插件。它将看到尚未创建的任何方法。 至此,我希望您,我的读者,已经感兴趣,因为接下来将是一个简短的介绍,并附有详细信息的链接。Lombok 还允许您自定义代码生成,例如并不总是需要所有 getter 和 setter,或者您可能需要不同的算法来生成哈希码。为了实现这一点,有单独的注释(我认为其中很多都不需要描述): @Getter/@Setter、@ToString、@EqualsAndHashCode、@NoArgsConstructor、@RequiredArgsConstructor 和 @AllArgsConstructor、@Log 这些是最重要的常见的。整套作品可以在这里
看到。特别注意 var 和 val。这意味着您可以编写如下代码:
package lombok;
import lombok.experimental.var;
@Data
public class Person {
private String name;
private int age;
public static void main(String[] args) {
var person = new Person();
person.setAge(22);
System.out.println(person);
}
}
为什么这是必要的?例如,我们有一个 RandomAccessFileChannel 类。为什么我们要编写这样的代码?
RandomAccessFileChannel channel = new RandomAccessFileChannel();
如果我们能做到这一点?
var channel2 = new RandomAccessFileChannel();
在我看来,这并不总是可以接受的。例如,我们有一个邪恶的方法,它返回一个邪恶的地图:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap() {
return new HashMap<>();
}
如果你这样称呼它:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
然后我们就或多或少地清楚了我们正在做什么。如果调用是这样的:
var listSetMap = evilMap();
那么只有魔鬼知道邪恶Map() 会返回什么,除非你查看该方法本身,否则你不知道。为什么要绕着源文件跑?一般来说,您需要小心这一点。 实验分支: 这里我想提一下@UtilityClass注解。它创建一个抛出异常的私有构造函数(因此肮脏的小手不会使用反射来干预那里)。它在类的开头非常漂亮——它告诉我们有实用方法。@Delegate注解实现了委托模式。假设您有一个类将某些内容委托给另一个类,并且您仅对某些方法进行了更改 - 此注释将使您免于重复方法,并且它将跟踪它们。如果您删除或添加方法,此注释将会注意到。 实验注释分支
GitHub
官方网站
为了使 IDE 能够与 lombok 正常工作并且不将方法突出显示为不存在,您必须安装该插件。官方网站有一个设置
部分,您可以在其中看到如何为每个 IDE 连接插件。如您所见,lombok 很受欢迎:> 5,000 个星和 > 1,000 个分叉。Spring 在其类中使用 lombok。如果你的项目中有 Spring,请看一下——它可能在你不知情的情况下引入了 lombok。