天天看點

Java中除了class之外,你還知道這個定義類的關鍵詞嗎?

作者:架構屆的郭德綱

以前我們定義類都是用class關鍵詞,但從Java 16開始,我們将多一個關鍵詞record,它也可以用來定義類。

這個record關鍵詞的引入,主要是為了提供一種更為簡潔、緊湊的final類的定義方式。下面就來具體了解record類的細節。

聲明record類

聲明record類的基礎文法:

record range(int start, int end){}
           

我們知道class類可以在單獨檔案中生命,也可以在其他類中申明。那麼record類也一樣,它有這幾種申明方式:

  1. 單獨檔案申明:
public record range(int start, int end){}
           
  1. 在類内部申明:
public class DidispaceTest {
    public record range(int start, int end){}
}
           
  1. 函數内申明:
public class DidispaceTest {
  public void test() {
    public record range(int start, int end){}
  }
}
           

record類詳解

在知道了如何申明之後,你一定會想用record申明的就那麼點元素,它到底會具備什麼能力呢?

因為record關鍵詞申明類主要是為了簡化一些類的申明,是以它本質就是一類特殊的class,或者說是某一個模版的class。

record申明的類,具備這些特點:

  1. 它是一個final類
  2. 自動實作equals、hashCode、toString函數
  3. 成員變量均為public屬性

是以,對于之前寫的range類,它等價于一個這樣的類:

public final class range{
    final int start;
    final int end;

    public range(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        range range = (range) o;
        return start == range.start && end == range.end;
    }

    @Override
    public int hashCode() {
        return Objects.hash(start, end);
    }

    @Override
    public String toString() {
        return "range{" +
                "start=" + x +
                ", end=" + y +
                '}';
    }

    public int start(){
        return start;
    }

    public int end(){
        return end;
    }
}
           

因為一些函數是隐藏的,在range定義的時候,我們看不到,是以我們可以嘗試寫這樣一段測試代碼來驗證一下:

@Test
public void test() {
  range r = new range(100, 200);
  log.info(r.toString());

  range r2 = new range(100, 200);
  log.info(String.valueOf(r.equals(r2)));
}
           

定義成員函數

因為record申明的本質也是類,那麼定義成員函數肯定也是可以的。

比如,我們可以這樣在record類中定義成員函數:

record range(int start, int end){
  int distance(){
    return end - start;
  }
}
           

然後,就可以這樣調用它:

range r = new range(100, 200);
r.distance();
           

如果你還想了解更多關于Java新特性的内容的話,我正在連載一個免費的Java新特性專欄:https://www.didispace.com/java-features/,文檔形式看Java新特性,閱讀學習體驗更佳哦!

來源:公衆号——程式猿DD