Lambda
表達式是迄今爲止 Java 8 討論和推廣最多的特性。我贊成 Lambda
是一個很大的改進,可是我認爲其餘一些 Java 8 特性因爲 Lambda
而顯得有點暗淡。在這篇文章中,我想展現另外一個很好的 Java 8 特性的一些例子:類型註解html
類型註解是一種能夠放在任何使用類型的位置上的註釋(注:在 Java 8 以前的版本中,只能在聲明式前使用註解)。這包括 new
運算符,類型轉換, implements
子句和 throws
子句。類型註解增強了分析Java代碼的能力,並可以確保更強大的類型檢查。java
在代碼實現上,Java 8爲註解增長了兩個新的註解類型:框架
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
public @interface Test {
}
複製代碼
TYPE_PARAMETER
容許註解被用在類型變量(注:即泛型)的聲明中(好比 MyClass<@Test T>
)。 TYPE_USE
容許註解能夠被用在任何類型使用的地方。函數
請注意,在 Java 8 中,如下示例中的註解沒有實際做用。Java 8 僅提供定義這些類型的註釋的功能,而後由框架和工具開發者來實際上使用它們。因此這是一個未來框架會提供給咱們的一個註解集合。如下大多數示例都來自 Type Annotations 規範和各類 Java 8 演示文稿。工具
帶有類型註解的簡單類型定義以下所示:spa
@NotNull String str1 = ...
@Email String str2 = ...
@NotNull @NotBlank String str3 = ...
複製代碼
類型註解也能夠用於嵌套類型code
Map.@NonNull Entry = ...
複製代碼
用於構造函數htm
new @Interned MyObject()
new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)
myObject.new @Readonly NestedClass()
複製代碼
類型轉換繼承
myString = (@NonNull String) myObject;
query = (@Untainted String) str;
複製代碼
繼承ci
class UnmodifiableList<T> implements @Readonly List<T> { ... }
複製代碼
泛型
List<@Email String> emails = ...
List<@ReadOnly @Localized Message> messages = ...
Graph<@Directional Node> directedGraph = ...
Map<@NonNull String, @NonEmpty List<@Readonly Document>> documents;
複製代碼
包括參數邊界和通配符邊界
class Folder<F extends @Existing File> { ... }
Collection<? super @Existing File> c = ...
List<@Immutable ? extends Comparable<T>> unchangeable = ...
複製代碼
拋出異常
void monitorTemperature() throws @Critical TemperatureException { ... }
void authenticate() throws @Fatal @Logged AccessDeniedException { ... }
複製代碼
instanceof
語句
boolean isNonNull = myString instanceof @NonNull String;
boolean isNonBlankEmail = myString instanceof @NotBlank @Email String;
複製代碼
以及最後 Java 8 的方法引用
@Vernal Date::getDay
List<@English String>::size
Arrays::<@NonNegative Integer>sort
複製代碼
類型註解是 Java 類型系統的一個有趣的補充。它們能夠應用於任何類型的使用,並啓用更詳細的代碼分析。若是您如今要使用類型註解,您應該查看 Checker Framework。