国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務(wù)器之家 - 編程語言 - Java教程 - lombok注解介紹小結(jié)

lombok注解介紹小結(jié)

2021-06-17 11:05sunsfan Java教程

lombok是一個可以幫助我們簡化java代碼編寫的工具類,這篇文章主要介紹了lombok注解介紹小結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

lombok注解介紹

lombok注解文檔 

lombok官網(wǎng)下載

lombok是一個可以幫助我們簡化java代碼編寫的工具類,尤其是簡化javabean的編寫,即通過采用注解的方式,消除代碼中的構(gòu)造方法,getter/setter等代碼,使我們寫的類更加簡潔,當(dāng)然,這帶來的副作用就是不易閱讀…不過,還是能看得懂吧,廢話不多說,先看一下lombok支持的一些常見的注解。

  • @nonnull
  • @cleanup
  • @getter/@setter
  • @tostring
  • @equalsandhashcode
  • @noargsconstructor/@requiredargsconstructor /@allargsconstructor
  • @data
  • @value
  • @sneakythrows
  • @synchronized
  • @log

@nonnull

這個注解可以用在成員方法或者構(gòu)造方法的參數(shù)前面,會自動產(chǎn)生一個關(guān)于此參數(shù)的非空檢查,如果參數(shù)為空,則拋出一個空指針異常,舉個例子來看看:

?
1
2
3
4
//成員方法參數(shù)加上@nonnull注解
public string getname(@nonnull person p){
  return p.getname();
}

實際效果相當(dāng)于:

?
1
2
3
4
5
6
public string getname(@nonnull person p){
  if(p==null){
    throw new nullpointerexception("person");
  }
  return p.getname();
}

用在構(gòu)造方法的參數(shù)上效果類似,就不再舉例子了。

@cleanup

這個注解用在變量前面,可以保證此變量代表的資源會被自動關(guān)閉,默認(rèn)是調(diào)用資源的close()方法,如果該資源有其它關(guān)閉方法,可使用@cleanup(“methodname”)來指定要調(diào)用的方法,就用輸入輸出流來舉個例子吧:

?
1
2
3
4
5
6
7
8
9
10
public static void main(string[] args) throws ioexception {
   @cleanup inputstream in = new fileinputstream(args[0]);
   @cleanup outputstream out = new fileoutputstream(args[1]);
   byte[] b = new byte[1024];
   while (true) {
    int r = in.read(b);
    if (r == -1) break;
    out.write(b, 0, r);
   }
 }

實際效果相當(dāng)于:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(string[] args) throws ioexception {
   inputstream in = new fileinputstream(args[0]);
   try {
    outputstream out = new fileoutputstream(args[1]);
    try {
     byte[] b = new byte[10000];
     while (true) {
      int r = in.read(b);
      if (r == -1) break;
      out.write(b, 0, r);
     }
    } finally {
     if (out != null) {
      out.close();
     }
    }
   } finally {
    if (in != null) {
     in.close();
    }
  }
}

是不是簡化了很多。

@getter/@setter

這一對注解從名字上就很好理解,用在成員變量前面,相當(dāng)于為成員變量生成對應(yīng)的get和set方法,同時還可以為生成的方法指定訪問修飾符,當(dāng)然,默認(rèn)為public,直接來看下面的簡單的例子:

?
1
2
3
4
5
6
7
8
9
10
11
public class programmer{
  @getter
  @setter
  private string name;
 
  @setter(accesslevel.protected)
  private int age;
 
  @getter(accesslevel.public)
  private string language;
}

實際效果相當(dāng)于:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class programmer{
  private string name;
  private int age;
  private string language;
 
  public void setname(string name){
    this.name = name;
  }
 
  public string getname(){
    return name;
  }
 
  protected void setage(int age){
    this.age = age;
  }
 
  public string getlanguage(){
    return language;
  }
}

這兩個注解還可以直接用在類上,可以為此類里的所有非靜態(tài)成員變量生成對應(yīng)的get和set方法。

@tostring/@equalsandhashcode

這兩個注解也比較好理解,就是生成tostring,equals和hashcode方法,同時后者還會生成一個canequal方法,用于判斷某個對象是否是當(dāng)前類的實例,生成方法時只會使用類中的非靜態(tài)和非transient成員變量,這些都比較好理解,就不舉例子了。
當(dāng)然,這兩個注解也可以添加限制條件,例如用@tostring(exclude={“param1”,“param2”})來排除param1和param2兩個成員變量,或者用@tostring(of={“param1”,“param2”})來指定使用param1和param2兩個成員變量,@equalsandhashcode注解也有同樣的用法。

@noargsconstructor/@requiredargsconstructor /@allargsconstructor

這三個注解都是用在類上的,第一個和第三個都很好理解,就是為該類產(chǎn)生無參的構(gòu)造方法和包含所有參數(shù)的構(gòu)造方法,第二個注解則使用類中所有帶有@nonnull注解的或者帶有final修飾的成員變量生成對應(yīng)的構(gòu)造方法,當(dāng)然,和前面幾個注解一樣,成員變量都是非靜態(tài)的,另外,如果類中含有final修飾的成員變量,是無法使用@noargsconstructor注解的。
三個注解都可以指定生成的構(gòu)造方法的訪問權(quán)限,同時,第二個注解還可以用@requiredargsconstructor(staticname=”methodname”)的形式生成一個指定名稱的靜態(tài)方法,返回一個調(diào)用相應(yīng)的構(gòu)造方法產(chǎn)生的對象,下面來看一個生動鮮活的例子:

?
1
2
3
4
5
6
7
8
9
10
@requiredargsconstructor(staticname = "sunsfan")
@allargsconstructor(access = accesslevel.protected)
@noargsconstructor
public class shape {
  private int x;
  @nonnull
  private double y;
  @nonnull
  private string name;
}

實際效果相當(dāng)于:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class shape {
  private int x;
  private double y;
  private string name;
 
  public shape(){
  }
 
  protected shape(int x,double y,string name){
    this.x = x;
    this.y = y;
    this.name = name;
  }
 
  public shape(double y,string name){
    this.y = y;
    this.name = name;
  }
 
  public static shape sunsfan(double y,string name){
    return new shape(y,name);
  }
}

@data/@value

呃!!

@data注解綜合了3,4,5和6里面的@requiredargsconstructor注解,其中@requiredargsconstructor使用了類中的帶有@nonnull注解的或者final修飾的成員變量,它可以使用@data(staticconstructor=”methodname”)來生成一個靜態(tài)方法,返回一個調(diào)用相應(yīng)的構(gòu)造方法產(chǎn)生的對象。這個例子就也省略了吧…

@value注解和@data類似,區(qū)別在于它會把所有成員變量默認(rèn)定義為private final修飾,并且不會生成set方法。

@sneakythrows

這個注解用在方法上,可以將方法中的代碼用try-catch語句包裹起來,捕獲異常并在catch中用lombok.sneakythrow(e)把異常拋出,可以使用@sneakythrows(exception.class)的形式指定拋出哪種異常,很簡單的注解,直接看個例子:

?
1
2
3
4
5
6
7
8
9
10
11
public class sneakythrows implements runnable {
  @sneakythrows(unsupportedencodingexception.class)
  public string utf8tostring(byte[] bytes) {
    return new string(bytes, "utf-8");
  }
 
  @sneakythrows
  public void run() {
    throw new throwable();
  }
}

實際效果相當(dāng)于:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class sneakythrows implements runnable {
  @sneakythrows(unsupportedencodingexception.class)
  public string utf8tostring(byte[] bytes) {
    try{
      return new string(bytes, "utf-8");
    }catch(unsupportedencodingexception uee){
      throw lombok.sneakythrow(uee);
    }
  }
 
  @sneakythrows
  public void run() {
    try{
      throw new throwable();
    }catch(throwable t){
      throw lombok.sneakythrow(t);
    }
  }
}

@synchronized

這個注解用在類方法或者實例方法上,效果和synchronized關(guān)鍵字相同,區(qū)別在于鎖對象不同,對于類方法和實例方法,synchronized關(guān)鍵字的鎖對象分別是類的class對象和this對象,而@synchronized得鎖對象分別是私有靜態(tài)final對象lock和私有final對象lock和私有final對象lock,當(dāng)然,也可以自己指定鎖對象,例子也很簡單,往下看:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class synchronized {
  private final object readlock = new object();
 
  @synchronized
  public static void hello() {
    system.out.println("world");
  }
 
  @synchronized
  public int answertolife() {
    return 42;
  }
 
  @synchronized("readlock")
  public void foo() {
    system.out.println("bar");
  }
}

實際效果相當(dāng)于:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class synchronized {
  private static final object $lock = new object[0];
  private final object $lock = new object[0];
  private final object readlock = new object();
 
  public static void hello() {
   synchronized($lock) {
    system.out.println("world");
   }
  }
 
  public int answertolife() {
   synchronized($lock) {
    return 42;
   }
  }
 
  public void foo() {
   synchronized(readlock) {
    system.out.println("bar");
   }
  }
 }

@log

這個注解用在類上,可以省去從日志工廠生成日志對象這一步,直接進(jìn)行日志記錄,具體注解根據(jù)日志工具的不同而不同,同時,可以在注解中使用topic來指定生成log對象時的類名。不同的日志注解總結(jié)如下(上面是注解,下面是實際作用):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@commonslog
private static final org.apache.commons.logging.log log = org.apache.commons.logging.logfactory.getlog(logexample.class);
@jbosslog
private static final org.jboss.logging.logger log = org.jboss.logging.logger.getlogger(logexample.class);
@log
private static final java.util.logging.logger log = java.util.logging.logger.getlogger(logexample.class.getname());
@log4j
private static final org.apache.log4j.logger log = org.apache.log4j.logger.getlogger(logexample.class);
@log4j2
private static final org.apache.logging.log4j.logger log = org.apache.logging.log4j.logmanager.getlogger(logexample.class);
@slf4j
private static final org.slf4j.logger log = org.slf4j.loggerfactory.getlogger(logexample.class);
@xslf4j
private static final org.slf4j.ext.xlogger log = org.slf4j.ext.xloggerfactory.getxlogger(logexample.class);

關(guān)于lombok的注解先寫到這里,當(dāng)然,還有其他一些注解需要大家自己去摸索,同時lombok一直在擴(kuò)展,將來肯定會加入更多的注解元素,拭目以待了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/sunsfan/article/details/53542374

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美在线免费 | 日韩免费一区 | 国产毛片一区二区 | 国产高清一区 | 成人在线高清 | 最近最新mv字幕免费观看 | 三级国产网站 | 激情久久av一区av二区av三区 | 99精品视频在线观看 | 国产欧美一区二区精品性色 | 日韩中文一区二区三区 | 精品国产黄a∨片高清在线 欧美一级免费 | 狠狠操夜夜操 | 久久久久久久成人 | 亚洲成人第一 | 一区二区三区在线 | 五月激情综合网 | 日韩欧美成人影院 | 欧美国产视频 | 国产成人精品一区二 | 欧美久久久久久 | 亚洲视频在线看 | 欧美日韩一区二区中文字幕 | 国产成人影院 | 亚洲成人精品av | 91精品国产乱码久久久久久 | 国产美女久久 | 久久国产亚洲 | 精品在线一区 | av激情在线| 精品九九久久 | 日韩电影一区 | 成人爽a毛片一区二区免费 成年人毛片视频 | 日韩精品影院 | 日韩国产中文字幕 | 欧美日韩不卡合集视频 | 男女视频网址 | 久久美女视频 | 天天干天天看天天操 | 亚洲成人一区 | 看亚洲a级一级毛片 |