成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java開發(fā)中如何自動填充SQL語句中的公共字段

運維 數(shù)據(jù)庫運維
枚舉僅僅是一個繼承于 java.lang.Enum、自動生成了 values() 和 valueOf() 方法的普通 Java 類而已,因此枚舉也歸為引用類型了。

[[342935]]

在很久很久以前,我們寫代碼時要慎重的考慮變量的數(shù)據(jù)類型,比如下面這些:

 

枚舉:盡管在 JDK 5 中增加了枚舉類型,但是 Class 文件常量池的 CONSTANT_Class_info 類型常量并沒有發(fā)生任何語義變化,仍然是代表一個類或接口的符號引用,沒有加入枚舉,也沒有增加過“CONSTANT_Enum_info”之類的“枚舉符號引用”常量。所以使用 enum 關(guān)鍵字定義常量,盡管從 Java 語法上看起來與使用 class 關(guān)鍵字定義類、使用 interface 關(guān)鍵字定義接口是同一層次的,但實際上這是由 Javac 編譯器做出來的假象,從字節(jié)碼的角度來看,枚舉僅僅是一個繼承于 java.lang.Enum、自動生成了 values() 和 valueOf() 方法的普通 Java 類而已,因此枚舉也歸為引用類型了。

然而到了 JDK 10 時,我們就有了新的選擇,JDK 10 中新增了 var 局部變量推斷的功能,使用它我們可以很 happy 的忘記數(shù)據(jù)類型這件事了,那它是如何使用的呢?接下來我們一起來看。

1、使用對比

接下來我們就使用對比的方式,來體會一下 var 的作用。

場景一:定義字符串

舊寫法:

  1. String str = "Hello, Java."

新寫法:

  1. var s = "Hello, Java."

PS:這里的舊寫法指的是 JDK 10 之前的版本,而新寫法指的是 JDK 10 以后(包含 JDK 10)的版本。

場景二:數(shù)值相加

舊寫法:

  1. int num1 = 111; 
  2. double num2 = 555.666d; 
  3. double num3 = num1 + num2; 
  4. System.out.println(num3); 

PS:當(dāng)遇到不同類型相加時(int+ double)會發(fā)生數(shù)據(jù)類型向上轉(zhuǎn)型,因此 num3 就會升級為 double 類型。

新寫法:

  1. var n1 = 111L; 
  2. var n2 = 555.666; 
  3. var n3 = n1 + n2; 
  4. System.out.println(n3); 

場景三:集合

舊寫法:

  1. List<Object> list = new ArrayList<>(); 
  2. list.add("Hello"); 
  3. list.add("Java"); 

新寫法:

  1. var list = new ArrayList<>(); 
  2. list.add("Hello"); 
  3. list.add("Java"); 

場景四:循環(huán)

舊寫法:

  1. for (Object item : list) { 
  2.     System.out.println("item:" + item); 
  3. for (int i = 0; i < 10; i++) { 
  4.     // do something... 

新寫法:

  1. for (var item : list) { 
  2.     System.out.println("item:" + item); 
  3. for (var i = 0; i < 10; i++) { 
  4.     // do something... 

場景五:配合 Lambda 使用

舊寫法:

  1. List<Object> flist = list.stream().filter(v -> 
  2.                 v.equals("Java")).collect(Collectors.toList()); 
  3. System.out.println(flist); 

新寫法:

  1. var flist = list.stream().filter(v -> 
  2.              v.equals("Java")).collect(Collectors.toList()); 
  3. System.out.println(flist); 

2、優(yōu)點分析

通過上面的示例我們可以看出, var 具備兩個明顯的優(yōu)點:提高了代碼的可讀性和命名對齊。

① 提高了可讀性

我們在沒有使用 var 之前,如果類型的名稱很長就會出現(xiàn)下面的這種情況:

  1. InternationalCustomerOrderProcessor<AnonymousCustomer, SimpleOrder<Book>> orderProcessor =  
  2.     createInternationalOrderProcessor(customer, order); 

當(dāng)限定每行不能超過 150 個字符的話,變量名就會被推到下一行顯示,這樣整個代碼的可讀性就變得很低。但當(dāng)我們使用了 var 之后,代碼就變成了這樣:

  1. var orderProcessor = createInternationalOrderProcessor(customer, order); 

從上述的代碼可以看出,當(dāng)類型越長時,var(可讀性)的價值就越大。

② 命名對齊

在不使用 var 時,當(dāng)遇到下面這種情況,代碼就是這樣的:

  1. // 顯式類型 
  2. No no = new No(); 
  3. AmountIncrease<BigDecimal> more = new BigDecimalAmountIncrease(); 
  4. HorizontalConnection<LinePosition, LinePosition> jumping = 
  5.   new HorizontalLinePositionConnection(); 
  6. Variable variable = new Constant(6); 
  7. List<String> names = List.of("Java""中文社群"); 

在使用了 var 之后,代碼是這樣的:

  1. var no = new No(); 
  2. var more = new BigDecimalAmountIncrease(); 
  3. var jumping = new HorizontalLinePositionConnection(); 
  4. var variable = new Constant(6); 
  5. var names = List.of("Java""中文社群"); 

從上述代碼可以看出使用了 var 之后,命名對齊了,整個代碼也變得更優(yōu)雅了。

3、使用規(guī)則 & 反例

var 的實現(xiàn)來自于 JEP 286 (改善提議 286),詳情地址 :http://openjdk.java.net/jeps/286

從 JEP 286 的標(biāo)題“局部變量類型推斷”可以看出,var 只能用于局部變量聲明,也就是說 var 必須滿足以下條件:

  • 它只能用于局部變量上;
  • 聲明時必須初始化;
  • 不能用作方法參數(shù)和全局變量(類變量)。

PS:因為 var 的實現(xiàn)必須根據(jù)等會右邊的代碼進行類型推斷,因此它不能被賦值 null 或不被初始化。

反例一:未初始化和賦值 null


 

 

反例二:中途類型更改

 

反例三:全局變量

 

反例四:作為返回值

 

4、原理分析

經(jīng)過前面的使用我們對 var 已經(jīng)有了初步的認識,但 var 的實現(xiàn)原理是什么呢?

為了搞清楚它的原理,我們對下面的代碼進行了編譯(使用命令 javac MainTest.java):

 

然后我們再用反編譯工具打開被編譯的類發(fā)現(xiàn):var 竟然被替換成一個個確定的數(shù)據(jù)類型了,如下圖所示:

由此我們可以得出結(jié)論:var 關(guān)鍵字的實現(xiàn)和它的名字密切相關(guān), var 只是局部類型推斷,它只會在 Java 編碼期和編譯期有效,當(dāng)類被編譯為 class 文件時,var 就會變成一個個確定的數(shù)據(jù)類型(通過推斷得出)。 所以我們可以把 var 通俗的理解為 Java 的語法糖,使用它可以讓我們快速優(yōu)雅的實現(xiàn)業(yè)務(wù)代碼,但 var 在字節(jié)碼層面是不存在的。

總結(jié)

本文我們介紹了 var(局部類型推斷)的使用,它可以用在局部變量、 for、Lambda 的變量聲明中,但不能用在全局變量的聲明中,也不能用它作為方法的返回值,并且在聲明時一定要進行初始化(也不能賦值為 null)。使用 var 可以有效的提高代碼的可讀性和命名對齊,它的實現(xiàn)原理,是在編譯期通過等號右側(cè)的代碼進行類型推斷,然后再將 var 替換成確定的數(shù)據(jù)類型。

本文轉(zhuǎn)載自微信公眾號「碼農(nóng)小胖哥」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)小胖哥公眾號。 

 

責(zé)任編輯:武曉燕 來源: 碼農(nóng)小胖哥
相關(guān)推薦

2025-06-05 01:00:00

2025-05-27 01:44:00

2010-09-03 15:47:40

SQL語句鎖定

2010-09-03 14:39:15

SQLSELECT語句

2010-09-07 13:41:50

SQL語句

2010-09-07 16:38:36

SQL語句SELECT DIST

2010-09-03 14:47:50

SQLSELECT語句

2010-09-03 11:25:58

SQL刪除

2009-04-28 09:38:53

SQL優(yōu)化物理查詢

2010-04-13 14:43:37

Oracle性能檢測

2010-09-07 10:19:31

SQL語句

2010-09-07 14:56:49

SQL語句CASE WHEN

2010-09-28 15:54:55

SQL替換字段

2024-01-03 17:42:32

SQL數(shù)據(jù)庫

2010-09-06 09:11:24

SQLUPDATE語句

2011-09-08 16:30:59

SQL Server查詢

2022-03-23 14:04:32

SQL字符串數(shù)據(jù)類型

2022-05-19 23:40:34

SQL語句引號

2009-03-04 13:10:41

SQL語句INSERTDELETE

2025-05-29 03:00:00

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 免费黄色片视频 | 亚洲午夜电影 | 97精品国产 | 天天精品综合 | 亚洲一区二区三区免费观看 | 国产精品久久久久久吹潮 | 伊人春色在线观看 | 免费黄色在线观看 | 在线播放国产一区二区三区 | 精产国产伦理一二三区 | 欧美在线观看一区 | 日韩成人在线观看 | 国产福利在线播放麻豆 | 在线观看不卡av | 精品国产乱码久久久久久图片 | 日韩影院一区 | 久久在线看 | 在线中文字幕日韩 | 欧美二级 | 久久久夜色精品亚洲 | 玖玖视频 | 欧美综合久久久 | 亚洲精品一二三区 | 日日夜夜狠狠操 | av中文字幕在线播放 | 国产精品免费视频一区 | 欧美日韩精品一区二区 | 欧洲免费毛片 | 成人免费高清 | 91av视频 | 欧美情趣视频 | 在线看无码的免费网站 | 欧美一区二区三区大片 | 人人操日日干 | 91精品国产91久久久久久最新 | 蜜桃精品在线 | 日韩精品一区中文字幕 | 一区二区三区亚洲 | 国产一区免费视频 | 成人欧美一区二区三区在线观看 | 国产99久久精品一区二区永久免费 |