java format用法_如何让Java代码更优雅

fc171d1499d284fee33a1ff600a55e30.png

Lombok通过注解的方式使臃肿的Java代码变得clean,常用的几种注解有:

@Setter

@Getter

@ToString

@Log

@Synchronized

@Data

@Value

@Builder

@NonNull

@Cleanup

Lombok需要引入相关的pom,以及安装lombok plugin 具体可百度,本文的重点是介绍lombok中常用的几种用法

@Setter/@Getter

您可以使用@Getter和/或@Setter注释任何字段,让lombok自动生成默认的getter / setter。

默认的getter只返回字段,如果字段名为foo,则命名为getFoo(如果字段的类型为boolean,则命名为isFoo)。如果字段名为foo,则返回void,默认的setter名为setFoo,并且该字段采用与该字段相同类型的1个参数。它只是将字段设置为此值。

除非您明确指定accessLevel,否则生成的getter/setter方法将是公共的PUBLIC。

您还可以在类上放置@Getter/@Setter注释,这种方式等同于将该类下的所有非静态字段上加上@Getter/@Setter注释。

With Lombok

import 

Vanilla Java

public 

@ToString

任何类定义都可以用@ToString注释,让lombok生成toString()方法的实现。默认情况下,它会按顺序打印每个字段,并以逗号分隔。

默认情况下,将打印所有非静态字段。如果要跳过某些字段,有两种方式可以解决。用哪种方式取决于跳过字段的多少。

1⃣️可以使用@ToString.Exclude注释这些字段

2⃣️@ToString(onlyExplicitlyIncluded = true)准确指定要使用的字段,然后使用@ ToString.Include标记要包含的每个字段。

With Lombok

import 

Vanilla Java

import 

@Log

你把@Log的变体放在你的类上(无论哪一个适用于你使用的日志系统);然后,您有一个静态的最终日志字段,初始化为您的类的名称,然后您可以使用它来编写日志语句。

以下是一些可以提供的选择:

@CommonsLog

With Lombok

import 

Vanilla Java

public 

@Synchronized

@Synchronized是synchronized方法修饰符的更安全的变体。与synchronized类似,注释只能用于静态和实例方法。它的操作类似于synchronized关键字,但它锁定在不同的对象上。关键字在此处锁定,但注释锁定在名为$ lock的字段上,该字段是私有的。

如果该字段不存在,则会为您创建该字段。如果注释静态方法,则注释会锁定名为$ LOCK的静态字段。

如果需要,您可以自己创建这些锁。如果您已经自己创建了$ lock和$ LOCK字段,那么它们当然不会生成。您还可以选择锁定另一个字段,方法是将其指定为@Synchronized注释的参数。在此用法变体中,不会自动创建字段,您必须自己显式创建它们,否则将发出错误

With Lombok

import 

Vanilla Java

public 

@Data

@Data是一个方便的快捷方式注释,它将@ToString,@ EqualsAndHashCode,@ Getter / @Setter和@RequiredArgsConstructor的特性捆绑在一起:换句话说,@ Data生成通常与简单POJO相关的所有样板(普通旧Java对象) )和bean:所有字段的getter,所有非final字段的setter,以及涉及类字段的相应toString,equals和hashCode实现,以及初始化所有final字段的构造函数,以及所有非final字段没有使用@NonNull标记的初始化程序,以确保该字段永远不为空。

所有生成的getter和setter都将是公共的。要覆盖访问级别,请使用显式的@Setter和/或@Getter批注对字段或类进行批注。您还可以使用此批注(通过将其与AccessLevel.NONE组合)来完全禁止生成getter和/或setter。

@Data可以很好地处理字段的泛型参数。为了在为具有泛型的类构造对象时减少样板,可以使用staticConstructor参数来生成私有构造函数,以及返回新实例的静态方法。这样,javac将推断变量名称。因此,通过这样声明:@Data(staticConstructor =“of”)类Foo <T> {private T x;}您可以通过写入来创建Foo的新实例:Foo.of(5);而不必写:new Foo <Integer>(5);.

With Lombok

import 

Vanilla Java

import 

@Value

@Value是@Data的不可变变体;默认情况下,所有字段都是私有和最终的,并且不会生成setter。默认情况下,类本身也是最终的,因为不可变性不是可以强制进入子类的东西。与@Data一样,对toString()有用,也会生成equals()和hashCode()方法,每个字段都会获得一个getter方法,并且还会生成一个覆盖每个参数的构造函数(在字段声明中初始化的最终字段除外)

可以使用字段上的显式访问级别或使用@NonFinal或@PackagePrivate注释来覆盖默认的最终和默认的私有行为。

通过显式使用该注释,可以覆盖构成@Value的任何“部件”的任何默认行为。

With Lombok

import 

Vanilla Java

import 

@Builder

@Builder注释为您的类生成复杂的构建器API。

@Builder允许您使用以下代码自动生成使您的类可实例化所需的代码:

Person.builder().name(“Adam Savage”).city(“San Francisco”).job(“Mythbusters”).job(Unchained Reaction”).build();

如果使用@Builder生成构建器来生成自己类的实例(除非将@Builder添加到不返回自己类型的方法中,否则总是如此),您可以使用@Builder(toBuilder = true)来生成你的类中的一个实例方法叫做toBuilder();它会创建一个以该实例的所有值开头的新构建器。您可以将@ Builder.ObtainVia注释放在参数(如果是构造函数或方法)或字段(如果类型为@Builder)上,以指示通过该方法获取该字段/参数的值的替代方法实例。例如,您可以指定要调用的方法:@ Builder.ObtainVia(method =“calculateFoo”)。

@Builder.Default

如果在构建会话期间从未设置某个字段/参数,则它始终为0 / null / false。如果您将@Builder放在类(而不是方法或构造函数)上,则可以直接在字段上指定默认值,并使用@ Builder.Default注释该字段:

@ Builder.Default private final long created = System.currentTimeMillis();

@Singular

通过使用@Singular注释注释其中一个参数(如果使用@Builder注释方法或构造函数)或字段(如果使用@Builder注释类),lombok会将该构建器节点视为集合。

目前支持的集合有:

  • java.util:
    • Iterable, Collection, and List (backed by a compacted unmodifiable ArrayList in the general case).
    • Set, SortedSet, and NavigableSet (backed by a smartly sized unmodifiable HashSet or TreeSet in the general case).
    • Map, SortedMap, and NavigableMap (backed by a smartly sized unmodifiable HashMap or TreeMap in the general case).
  • Guava's com.google.common.collect:
    • ImmutableCollection and ImmutableList (backed by the builder feature of ImmutableList).
    • ImmutableSet and ImmutableSortedSet (backed by the builder feature of those types).
    • ImmutableMap, ImmutableBiMap, and ImmutableSortedMap (backed by the builder feature of those types).
    • ImmutableTable (backed by the builder feature of ImmutableTable).

With Lombok

import 

Vanilla Java

import 

@NonNull

您可以在方法或构造函数的参数上使用@NonNull让lombok为您生成null-check语句。

null检查看起来像if(param == null)抛出新的NullPointerException(“param标记为@NonNull但是为null”);并将插入到方法的最顶层。对于构造函数,将在任何显式this()或super()调用之后立即插入空检查。

With Lombok

import 

Vanilla Java

import 

@Cleanup

您可以使用@Cleanup确保在代码执行路径退出当前作用域之前自动清除给定资源。您可以通过使用@Cleanup注释来注释任何局部变量声明来执行此操作,如下所示:

@Cleanup InputStream in = new FileInputStream(“some / file”);

因此,在您所在范围的末尾,调用in.close()。保证通过try / finally构造运行此调用。请看下面的示例,看看它是如何工作的。

如果要清理的对象类型没有close()方法,而是其他一些无参数方法,则可以指定此方法的名称,如下所示:

@Cleanup(“dispose”)org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent,0);

默认情况下,清除方法假定为close()。不能通过@Cleanup调用带有1个或多个参数的清理方法。

With Lombok

import 

Vanilla Java

import 

现阶段写文章旨在自我提升,如果您看完了文章有一丝收获,不亦乐乎

附上lombok的doc链接:https://projectlombok.org/features/all

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值