var 是 Java10 版本中新出的特性,用它來定義局部變量。var 不是關鍵字,至關於一種動態類型,編譯器根據變量所賦的值來推斷類型。因此必須在定義變量的時候賦初始值。java
@Test public void testJDK10VarLocalVariable(){ var num1 = 1000; var num2 = 1.001; var str = "hello var"; var list = new ArrayList<>(); var map = new HashMap<>(); } @Test public void testNoramlVariable(){ int num1 = 1000; double num2 = 1.001; String str = "hello var"; List list = new ArrayList<>(); Map map = new HashMap(); }
在咱們平常的工做中,有時候須要用到一大段的字符串,這些字符串須要換行,須要排版,須要轉義。在一個文本編輯器中,這固然是很是容易的事情。可是在 java 代碼中,就是一個噩夢了。而新的文本塊使用"""這個符號,進行拼接。編程
@Test public void testNormalString(){ String text = "{" + "\n" +" \"username\": \"lengleng\",\n" +" \"password\": \"123456\" \n" +"}"; System.out.println(text); } @Test public void testNewJdk13TextBlock(){ var text = """ { "username": "lengleng", "password": "123456" } """; System.out.println(text); }
@Test public void testNormalSwitch() { int day = 2; switch (day) { case 1: case 2: case 3: case 4: case 5: System.out.println("workday"); case 6: case 7: System.out.println("weekend"); default: System.out.println("invalid"); } }
@Test public void testNormal(){ List<String> fruitsTmp = new ArrayList<>(); fruitsTmp.add("apple"); fruitsTmp.add("banana"); fruitsTmp.add("orange"); Map<Integer, String> numbersTmp = new HashMap<>(); numbersTmp.put(1, "one"); numbersTmp.put(2, "two"); numbersTmp.put(3, "three"); }
@Test public void testNewJdk9() { var fruits = List.of("apple", "banana", "orange"); var numbers = Map.of(1, "one", 2, "two", 3, "three"); }
Records 的目標是擴展 Java 語言語法,Records 爲聲明類提供了一種緊湊的語法,用於建立一種類中是「字段,只是字段,除了字段什麼都沒有」的類。經過對類作這樣的聲明,編譯器能夠經過自動建立全部方法並讓全部字段參與 hashCode()等方法。幹掉 lombok 只須要經過 record 聲明便可完成實體字段的 get 和構造器方法。app
public record Demo(String username, String password) { } @Test public void testJdk15Record() { var demo = new Demo("lengleng", "123456"); System.out.println(demo.password()); System.out.println(demo.username()); }
Java8 帶來了許多改變,其中之一就是 default 修飾的接口方法。這些方法改變了咱們已知的接口,如今咱們可以在接口中定義默認實現方法。若是你大量使用 default 方法在你的應用接口中,如今能夠經過 JDK9 的接口私有方法來重構。編輯器
public interface PrivateInterface { private void printF(){ System.out.println("lengleng"); } default void getPassword(){ printF(); System.out.println("123456"); } } @Test public void testGetPassword() { var privateInterface = new PrivateInterfaceImpl(); privateInterface.getPassword(); }
可擴展性不是面向對象編程的一個重要指標嗎?爲何要限制可擴展性呢?其實,面向對象編程的最佳實踐之一,就是要把可擴展性的限制在能夠預測和控制的範圍內,而不是無限的可擴展性。工具
public sealed interface Pet permits Cat { }
分配權限的子類能夠正常的實現此接口開發工具
public final class Cat implements Pet { }