您当前的位置:网站首页>束昱辉,生僻字大全-撒哈拉旅行计划,摩洛哥路线进发

束昱辉,生僻字大全-撒哈拉旅行计划,摩洛哥路线进发

2019-07-13 08:37:23 投稿作者:admin 围观人数:326 评论人数:0次

1 简介

Lombok是一款好诱人的用随手的东西,就像Google Guava相同,在此予以强烈推荐,每一个Java工程师都应该运用它。Lombok是一种Java™实用东西,可用来协助开发人员消除Java的冗长代码,尤其是关于简略的Java目标(POJO)。它通过注释完成这一意图。通过在开发环境中完成Lombok,开发人员能够节约构建比方hashCode()和equals()这样的办法以及以往用来分类各种accessor和mutator的许多时刻。

2 IntelliJ装置Lombok

通过IntelliJ的插件中心装置

Install Plugin

终究需求留意的是,在运用lombok注解的时分记得要导入lombok.jar包到工程,假如运用的是Maven Project,要在pom.xml中添加依靠。


org.projectlombok
lombok
1.16.8

仿制代码

3 Lombok用法

3.1 Lombok注解阐明

  • val:用在局部变量前面,相当于将变量声明为final
  • @NonNull:给办法参数添加这个注解会主动在办法内对该参数进行是否为空的校验,假如为空,则抛出NPE(NullPointerException)
  • @Cleanup:主动办理资源,用在局部变量之前,在当时变量规模内行将履行结束退出之前会主动收拾资源,主动生成try-finally这样的代码来封闭流
  • @Getter/@Setter:用在特点上,冈仁波齐再也不必自己手写setter和gett束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发er办法了,还能够指定拜访规模
  • @ToString:用在类上,能够主动覆写toString办法,当然还能够加其他参数,例如@ToString(exclude=”id”)扫除id特点,或许@ToString(callSuper=true, includeFieldNames=true)调用父类的toString办法,包括一切特点
  • @EqualsAndHashCode:用在类上,主动生成equals办法和hashCode办法
  • @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor:用在类上,主动生成无参结构和运用一切参数的结构函数以及把一切@NonNull特点作为参数的结构函数,假如指定staticName = “of”参数,一起还会生成一个回来类目标的静态工厂办法,比运用结构函数便利许多
  • @Data:注解在类上,相当于一起运用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,关于POJO类非常有用
  • @Value:用在类上,是@Data的不行变办法,相当于为特点添加final声明,只供给getter办法,而不供给setter办法
  • @Builder:用在类、结构器、办法上,为你供给杂乱的builder APIs,让你能够像如下办法相同调用Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多阐明参阅Builder
  • @SneakyThrows:主动抛受检反常,而无需显式在办法上运用throws句子
  • @Synchronized:用在办法上,将办法声明为舒畅吗同步的,并主动加锁,而锁目标是一个私有的特点$lock或$LOCK,而java中的synchronize米粉肉的做法d关键字锁目标是this,锁在this或许自己的类目标上存在副作用,便是你你轻点不能阻挠非受控代码去锁this或许类目标,这可能会导致竞赛条件或许其它线程过错
  • @Getter(lazy=true):能够代替经典的Double Check Lock样板代码
  • @Log:依据不同的注解生成不同类型的log目标,可是实例称号都是log,有六种可选完成类
  • @CommonsLog Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
  • @Log Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
  • @Log4火炎焱燚j Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
  • @Log4j2 Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
  • @Slf4j Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  • @XSlf4j Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);

3.2 Lombok代码示例

val示例

public static void main(String[] args) {
val sets = new HashSet();
val lists = new ArrayList();
val maps = new HashMap();
//=>相当于如下
final Set sets2 = new HashSet<>();
final List lists2 = new ArrayList<>();
final Map maps2 = new HashMap<>();
}

@NonNull示例

public void notNullExample(@NonNull String string) {

string.length();

}

//=>相当于

public void notNullExample(String string) {

if (string != null) {

string.length();

} else {

throw new NullPointerException("null");

}

}

@Cleanup示例

public static void main(String[] args) {
try {
@Cleanup InputStream inputStream = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//=>相当于
InputStream inputStream = null;
try {
沈明月inputStream = new FileInputStream(args[0]);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStack女性裸体Trace();
}
}
}
}

@Getter/@Setter示例

@Setter(AccessLevel.PUBLIC)
@Getter(AccessLevel.PROTECTED)
private int id;
private String shap;

@ToString示例

@ToString(exclude = "i束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发d", callSuper = true, includeFieldNames = true)
public class LombokDemo {
private int id;
private String name;
private int age;
public static void main(String[] args) {
//输出LombokDemo(super=LombokDemo@48524010, name=null, age=0)
System.out.println(new LombokDemo());
}
}

@EqualsAndHashCode示例

@EqualsAndHashCode(exclude = {"id", "shape"}, callSuper = false)
public class LombokDemo {
private int id;
private String燊怎样读 shap;
}

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor示例

@NoArgsConstructor
@束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发RequiredArgsConstructor(staticName = "of")
@AllArgsConstructor
public class LombokDemo {
@NonNull
private int id;
@NonNull
private String shap;
private int age;
public static void main(String[] args) {
new LombokDemo(1, "circle");
//运用静态工厂办法
LombokDemo.of(2, "circle");
//无参结构
new LombokDemo();
//包括一切参数
new LombokDemo(1, "circle", 2);
}
}

@Data示例

import lombok.Data;
@Data
public class Menu {
private String shopId;
private String sku束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发MenuId;
private String skuName;
private String normalizeSkuName;
private String dishMenuId;
private String dishName;
private String dishNum;
//默许阈值
private float thresHold = 0;
//新阈值
private float newThresHold = 0;
//总得分
private float totalScore = 0;
}

@Value示例

@Value
public class LombokDemo {
@NonNull
private int id;
@NonNull
private String shap;
private int age;
//相当于
private final int id;
public int getId() {
return this.id;
}
...
}

@Builder示例

@Builder
public class BuilderExample {
private String name;
private int age;
@Singular
private Set occupations;
public static void main(String[] args) {
BuilderExample test = BuilderExample.builder().age(步步生莲11).name("test").build();
}
}

@SneakyThrows示例

import lombok.SneakyThrows;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import 猫交配java.io.UnsupportedEncodingException;
public class Test {
@SneakyThrows()
public void read() {
InputStream inputStream = new FileInputStream("");
}
@SneakyThrows
public void write() {
throw new UnsupportedEncodingException();
}
//相当于
public void read() throws FileNotFjudicaloundException {
InputStream inputStream = new FileInputStream("");
}
public void write() throws UnsupportedEncodingException {
throw new UnsupportedEncodingException();
}
}

@Synchronized示例

public class SynchronizedDemo {
@Synchronized
public static void hello() {
S明珠ystem.out.println("world");
}
//相当于
private static final Object $LOCK = new Object[0];
public static void hello() {
synchronized ($LOCK) {
System.out.println("world");
}
}
}

@Getter(lazy = true)

public class Gette断奶rLazyExample {
@Getter(lazy = true)
private final double[] cached = expensive();
private double[] expensive() {
double[] result = new double[1000000];
for (int i = 0; i < result.length; i++) {
result[i] = Math.asin(i);
}
return resu汉逆之吕布新传lt;
}
}
// 相当于如下所示:
import java.util.concurrent.atomic.AtomicReference;
public class GetterLazyExample {
private final AtomicReference cached = new AtomicReference<>();
public double[] getCached() {
java.lang.Object value = this.cached.get();
if (value == null) {
synchronized (this.cached) {
value = this.cached.get();
if (value == null) {
final double[] actualValue = expensive();
value = actualValue == null ? this.cached : actualValue;
this.cached.set(value);
}
}
}
return (double[]) (value == this.cached ? null : value);
}
private double[] expensive() {
double[] result = new double[1000000];
for (int i = 0; i < result.length; i++) {
result[i] = Math.asin(i);
}
return result;
}
}

4 Lombok注解原理

说道 Lombok,咱们就得去说到 JSR 269: Pluggable Annotation Processing API (www.jcp.org/en/jsr/deta…) 。JSR 269 之前咱们也有注解这样的神器,可是咱们比方想要做什么有必要运用反射,反射的办法局限性较大。首要,它有必要界说@Retention为RetentionPolicy.RUNTIME,束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发只能在运转时通过反射来获取注解值,使得运转时代码功率下降。其次,假如想在编译阶段运用注解来进行一些查看,对用户的某些不合理代码给出过错报告,反射的运用办法就力不从心了。而束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发 JSR 269 之后咱们能够在 Javac的编译期运用注解做这些工作。所以咱们发现中心的区别是在 运转期 仍是 编译期

从上图可知,Annotation Processing 是在解析和生成之间的一个进程。具体具体进程如下:

上图是 Lombok 处理流程,在Javac 解析成笼统语法树之后(AST), Lombok 依据自己的注解处理器,动态的修正 AST,添加新的节点(所谓代码),终究通过剖析和生成字节码

自从Java 6起,javac就支撑“JSR 269 Pluggable Annotation Processing API”规束昱辉,生僻字大全-撒哈拉游览方案,摩洛哥道路进发范,只需程序完成了该API,就能在javac运转的时分得到调用

  • 常用的项目办理东西Maven所运用的java编译东西来源于装备的第三方东西,假如咱们装备这个第三方东西为Oracle javac的话,那么Maven也就直接支撑lombok了;
  • Intellij Idea装备的编译东西为Oracle javac的话,也就直接支撑lombok了;

IDE东西问题处理:

现在有一个A类,其中有一些字段,没有创立它们的setter和getter办法,运用了lombok爱豆是什么意思的@Data注解,别的有一个B类,它调用了A类实例的相应字段的setter和getter办法

编译A类和B类地点的项目,并不会报错,由于终究生成的A类字节码文件中存在相应字段的setter和getter办法

可是,IDE发现B类源代码中所运用的A类实例的setter和getter办法在A类源代码中找不到界说,IDE会以为这是过错

要处理以上这个不是真实过错的过错,能够下载装置Intellij Idea中的"Lombok plugin"。

5 自界说支撑JSR269的注解

一般javac的编译进程,java文件首要通过进行解析构建出一个AST,然后履行注解处理,终究通过剖析优化生成二进制的.class文件。咱们能做到的是,在注解处理阶段进行一些相应处理。首要咱们在META-INF.services下创立如下文件:

文件中指定咱们的注解处理器:com.alipay.kris.other.lombok.MyAnnotaionProcessor,然后咱们接能够编写自己的注解处理器,一个简略的实例代码如下:

@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("com.alipay.kris.other.lombok.*")
public class MyAnnotaionProcessor extends AbstractProcessor {
public MyAnnotaionProcessor() {
super();
}
@Override
public boolean process(Set
for (Element elem : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) {
MyA妃深nnotation annotation = elem.getAnnotation(MyAnnotation.class);
String message = "annotation found in我是 " + elem.getSimpleName()
+ " with " + annotation.value();
addToString(elem);
processi厄瓜多尔ngEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, message);
}
return true; // no further processing of this annotation type
}
}

更多Java常识收拾

收拾不易,需求完好材料的帮助转发重视后台私信“Java材料”即可获取,谢谢我们。

the end
撒哈拉旅行计划,摩洛哥路线进发