http://www.blogjava.net/fancydeepin/archive/2012/07/12/lombok.html
http://jnb.ociweb.com/jnb/jnbJan2010.html
lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码。
前置条件:
- 安装lombok至eclipse
- 引入lombok
lombok 注解:
lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://projectlombok.org/features/index. 下面介绍几个我常用的 lombok 注解:
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
lombok 提供的注解不多,可以参考官方视频的讲解和官方文档。
Lombok 注解在线帮助文档:http://projectlombok.org/features/index. 下面介绍几个我常用的 lombok 注解:
@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在属性上;为属性提供 setting 方法
@Getter:注解在属性上;为属性提供 getting 方法
@Log4j :注解在类上;为类提供一个 属性名为log 的 log4j 日志对象
@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
@NonNull: 注解在属性上,会对setter和构造方法进行NPE判断
@ToString:注解在类上
@Log4j
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true, exclude = "id")
@EqualsAndHashCode(exclude = { "id" })
public class Person {
@NonNull
private String id;
private String name;
private String identity;
}
@Cleanup
The
@Cleanup
annotation can be used to ensure that allocated resources are released. When a local variable is annotated with @Cleanup
, any subsequent code is wrapped in a try/finally
block that guarantees that the cleanup method is called at the end of the current scope. By default @Cleanup
assumes that the cleanup method is named "close", as with input and output streams. However, a different method name can be provided to the annotation's value
parameter. Only cleanup methods which take no parameters are able to be used with this annotation.
Lombok annotated code:
public void testCleanUp() { try { @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream(); baos.write(new byte[] {'Y','e','s'}); System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); } }
Equivalent Java source code:
public void testCleanUp() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { baos.write(new byte[]{'Y', 'e', 's'}); System.out.println(baos.toString()); } finally { baos.close(); } } catch (IOException e) { e.printStackTrace(); } }
@Synchronized
Using the
synchronized
keyword on a method can result in unfortunate effects, as any developer who has worked on multi-threaded software can attest. The synchronized keyword will lock on the current object (this
) in the case of an instance method or on the class
object for a static method. This means that there is the potential for code outside of the control of the developer to lock on the same object, resulting in a deadlock. It is generally advisable to instead lock explicitly on a separate object that is dedicated solely to that purpose and not exposed in such a way as to allow unsolicited locking. Project Lombok provides the @Synchronized
annotation for that very purpose.
Annotating an instance method with
@Synchronized
will prompt Lombok to generate a private locking field named $lock
on which the method will lock prior to executing. Similarly, annotating a static method in the same way will generate a private static object named $LOCK
for the static method to use in an identical fashion. A different locking object can be specified by providing a field name to the annotation's value
parameter. When a field name is provided, the developer must define the property as Lombok will not generate it.
Lombok annotated code:
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); @Synchronized public String synchronizedFormat(Date date) { return format.format(date); }
Equivalent Java source code:
private final java.lang.Object $lock = new java.lang.Object[0]; private DateFormat format = new SimpleDateFormat("MM-dd-YYYY"); public String synchronizedFormat(Date date) { synchronized ($lock) { return format.format(date); } }
@SneakyThrows
@SneakyThrows
is probably the Project Lombok annotation with the most detractors, since it is a direct assault on checked exceptions. There is a lot of disagreement with regards to the use of checked exceptions, with a large number of developers holding that they are a failed experiment. These developers will love @SneakyThrows
. Those developers on the other side of the checked/unchecked exception fence will most likely view this as hiding potential problems.
Throwing IllegalAccessException
would normally generate an "Unhandled exception" error if IllegalAccessException
, or some parent class, is not listed in a throws clause:
When annotated with @SneakyThrows
, the error goes away.
By default, @SneakyThrows
will allow any checked exception to be thrown without declaring in the throws
clause. This can be limited to a particular set of exceptions by providing an array of throwable classes ( Class<? extends Throwable>
) to the value
parameter of the annotation.
Lombok annotated code:
@SneakyThrows
public void testSneakyThrows() {
throw new IllegalAccessException();
}
Equivalent Java source code:
public void testSneakyThrows() {
try {
throw new IllegalAccessException();
} catch (java.lang.Throwable $ex) {
throw lombok.Lombok.sneakyThrow($ex);
}
}
A look at the above code and the signature of Lombok.sneakyThrow(Throwable)
would lead most to believe that the exception is being wrapped in aRuntimeException
and re-thrown, however this is not the case. The sneakyThrow
method will never return normally and will instead throw the provided throwable completely unaltered.
@SneakyThrows
is probably the Project Lombok annotation with the most detractors, since it is a direct assault on checked exceptions. There is a lot of disagreement with regards to the use of checked exceptions, with a large number of developers holding that they are a failed experiment. These developers will love @SneakyThrows
. Those developers on the other side of the checked/unchecked exception fence will most likely view this as hiding potential problems.IllegalAccessException
would normally generate an "Unhandled exception" error if IllegalAccessException
, or some parent class, is not listed in a throws clause:@SneakyThrows
, the error goes away.@SneakyThrows
will allow any checked exception to be thrown without declaring in the throws
clause. This can be limited to a particular set of exceptions by providing an array of throwable classes ( Class<? extends Throwable>
) to the value
parameter of the annotation.@SneakyThrows public void testSneakyThrows() { throw new IllegalAccessException(); }
public void testSneakyThrows() { try { throw new IllegalAccessException(); } catch (java.lang.Throwable $ex) { throw lombok.Lombok.sneakyThrow($ex); } }
Lombok.sneakyThrow(Throwable)
would lead most to believe that the exception is being wrapped in aRuntimeException
and re-thrown, however this is not the case. The sneakyThrow
method will never return normally and will instead throw the provided throwable completely unaltered.
没有评论:
发表评论