日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Effective.Java第23-33条(泛型相关)

發布時間:2025/7/25 java 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Effective.Java第23-33条(泛型相关) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

23.? 類結構層次優于標簽類

?  有時你會碰到一個類,它的實例有一個或多個風格,并且包含一個tag屬性表示實例的風格。例如,如下面的類表示一個圓或者矩形:

public class Figure {/*** 標簽: circle表示圓 rectangle表示矩形*/private String tag;private double length;private double width;private double radis;public Figure(double radis) {super();this.radis = radis;}public Figure(double length, double width) {super();this.length = length;this.width = width;}public double area() {// 返回圓的面積if ("circle".equals(tag)) {return Math.PI * radis * radis;}if ("rectangle".equals(tag)) {return length * width;}return 0;}

?

  這樣的類有很多缺點,代碼可讀性查,將來增加一個三角形又得重寫計算面積的方式,而且需要增加三角形屬性。

?

解決辦法,用類層次結構代替:

package cn.qlq;public abstract class Figure {abstract double area(); }class Circle extends Figure {private double radis;@Overridedouble area() {return Math.PI * radis * radis;}}class Rectangle extends Figure {private double length;private double width;@Overridedouble area() {return length * width;}}

?

24.? 支持使用靜態成員類而不是非靜態類

  有四種嵌套類:靜態成員類、非靜態成員類、匿名內部類和局部類。

  靜態成員類是最簡單的嵌套類。最好把它看做是一個普通的類,恰好在另一個類中聲明,并且可以訪問宿主類的成員,甚至是那些被聲明為私有類的成員。其一個主要用途是作為公共幫助類,例如Calculator可以使用Calculator.Operation.PLUS。

  在語法上,靜態成員和非靜態成員類之間的唯一區別是靜態成員類在其宿主類中用static修飾。

  如果聲明了一個不需要訪問宿主實例的成員類,不如用static修飾使之成為靜態成員類。

?

25.? 將源文件限制為單個頂級類

  雖然Java編譯器允許在單個Java文件中定義多個頂級類,只需要文件名與public修飾的類一致即可,但是不建議這么做。

?

26.? 不要使用原始類型

  也就是泛型盡量指明類型,雖然存在泛型擦除,但是至少編譯期間會減少一些潛在的錯誤。比如你很容易將BigInteger和BigDecimal存入同一個集合。

比如下面就是正確的用法:(右邊直接用<>即可,編譯器會自動推斷出正確的實際類型參數,不寫<>會編譯警告)

Map<String, Object> result = new HashMap<>();

?

?泛型的術語如下:

?

27.? 消除非檢查警告

?  盡可能的消除每一個未經檢查的警告。

  如果不能消除警告,但你確保證明引發警告的代碼是類型安全的,那么只能用@SuppressWarnings("unused")來消除警告(注意使用注解壓制警告的時候寫明原因)。

  總之,未經檢查的警告是重要的,在運行時可能會出現ClassCaseException異常。

比如:

List<String> list = new ArrayList();

  會有一個警告:ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized

?

寫成下面這樣則不會出現警告,雖然右邊只是一個<>符號,并沒有指定真正的實際類型參數,但編譯器會根據前面的自動推斷。

List<String> list = new ArrayList<>();

?

?28.? 列表優于數組

?  列表與數組在兩方面不同。

  首先,數組是斜變的,也就是如果Sub是Super的子類,則數組類型Sub[]是Super[]的子類型;集合是不變的,對于任何兩種不同的類型Tyepe1和Type2,List<Type1>既不是List<Type2>的子類型也不是父類型。

也就是說:如下編譯不通過

// 正確編譯Object[] objects = new Long[11];

?

如下會報編譯錯誤:

// 編譯不通過List<Object> lists = new ArrayList<Long>();

?

?  第二個差異就是數組被具體化了,也就是數組在運行時知道并強制執行它們的元素類型。如果嘗試將String放入一個Long型數組是做不到的,但是通過集合不指定具體的實際類型卻可以做到。

?

  由于上面的差異,數組和泛型不能很好的結合在一起。例如,創建泛型類型的數組,參數化類型的數組以及類型參數的數組都是非法的。因此,這些數組創建表達式都不合法:

new List<E>();new List<String>();new E<String>();

?

補充:Java語言并不支持列表,所以一些泛型類型(如ArrayList)必須在數組上實現,其他的泛型類型,比如HashMap是為了提高性能而實現的。

?

29.? 優先考慮泛型

  泛型類型比需要在客戶端代碼中強制轉換的類型更安全,更易于使用。當你設計新的類型時,確保它們可以在沒有這種強制轉換的情況下使用。這通常意味著使類型泛型化。

  如果有任何現有的類型應該是泛型化但實際上卻不是,考慮把它們泛型化。這使得這些類型的新用戶的使用更容易,而不會破壞現有的客戶端。

  

30.? 優先使用泛型方法

  泛型類和泛型方法需要選擇的時候優先使用泛型方法。

?

31.? 使用限定通配符來增加API的靈活性(重要)

  參數化類型是不變的。比如List<String> 你就只能存放String類型的數據。

  相對于提供的不可變的類型,有時候使用限定通配符可以獲得更高的靈活性。

  在API中使用通配符類型很棘手,但使得API更加靈活。一條基本的原則就是producer-extends,consumer-super(PECS)。還需要記住,所有Comparable和Comparator都是消費者。如果一個輸入參數同時是生產者和消費者那么考慮使用精確類型。

如下:

package cn.qlq;import java.util.ArrayList; import java.util.List;public class Client {public static void main(String[] args) {List<Integer> set1 = new ArrayList<>();set1.add(1);List<Float> set2 = new ArrayList<>();set2.add(1F);List<Number> unionMember = unionMember(set1, set2);System.out.println(unionMember);}private static <E> List<E> unionMember(List<? extends E> set1, List<? extends E> set2) {List<E> result = new ArrayList<>();result.addAll(set1);result.addAll(set2);return result;}}

  上面的unionMember方法的參數聲明,兩個參數set1和set2都是E的生產者所以PCES告訴我們應該用extends。

  請注意:返回類型仍然是E,不要使用限定通配符作為返回類型。

?

32.? 合理地結合泛型和可變參數

  一般不要同時使用可變的泛型參數。

?

33.? 優先考慮類型安全的異構容器

?  

?

轉載于:https://www.cnblogs.com/qlqwjy/p/11049475.html

總結

以上是生活随笔為你收集整理的Effective.Java第23-33条(泛型相关)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。