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

Java 8默認方法會破壞你的(用戶的)代碼

開發 后端
Java 8的默認方法試圖嘗試更進一步簡化Java API。不幸的是,這一最近的語言擴展帶來了一系列復雜的規則,但只有少部分Java開發者意識到這一點。這篇文章告訴你為什么引入默認方法會破壞你的(用戶的)代碼。

Java 8的默認方法試圖嘗試更進一步簡化Java API。不幸的是,這一最近的語言擴展帶來了一系列復雜的規則,但只有少部分Java開發者意識到這一點。這篇文章告訴你為什么引入默認方法會破壞你的(用戶的)代碼。

[[137878]]

起初看來,默認方法給Java虛擬機的指令集帶來了很多新的特性。最終,開發庫的人能夠在不帶來客戶端代碼的兼容性問題的情況下,升級API。使用 默認方法,任何實現庫接口的類都自動適應接口引入的默認方法。一旦用戶更新了他實現的類,就能夠很簡單使用更有意義的方法來覆蓋原有默認方法。更好的是, 用戶可以在覆蓋方法時候,調用接口的默認實現,同時增加業務邏輯。

到現在為止,一切都是很好。但是,在創建接口的時候增加默認方法可能使得Java代碼不兼容。這個從下面的例子可以很容易弄明白。我們假設一個庫需要它的一個接口的作為輸入:

 

  1. interface SimpleInput { 
  2.   void foo(); 
  3.   void bar(); 
  4.  
  5. abstract class SimpleInputAdapter implements SimpleInput { 
  6.   @Override 
  7.   public void bar() { 
  8.     // some default behavior ... 
  9.   } 

Java 8之前,類似于上面聯合使用一個接口和一個適配器類的方式,是Java程序語言中一種非常常用的設計模式。該適配器通常由庫提供者提供,用于節省庫的使用者的某些操作。但是,如果采用接口的方式提供,就類似允許多重繼承了。

我們進一步假設一個用戶使用了如下的適配器:

  1. class MyInput extends SimpleInputAdapter { 
  2.   @Override 
  3.   public void foo() { 
  4.     // do something ... 
  5.   } 
  6.   @Override 
  7.   public void bar() { 
  8.     super.bar(); 
  9.     // do something additionally ... 
  10.   } 

通過這種實現方式,我們最終可以和庫進行交互。注意我們是怎樣覆蓋bar方法,并為默認的實現增加額外的功能的。

如果將該庫移植到Java 8,將會發生什么呢?首先,該庫很大可能性會廢棄適配器類,而使用默認方法提供該功能。最終,該接口的形式類似如下所示:

  1. interface SimpleInput { 
  2.   void foo(); 
  3.   default void bar() { 
  4.     // some default behavior 
  5.   } 

使用這個新的接口,用戶可以更新他的代碼,采用默認方法來代替原來的適配器類。通過使用接口代替適配器類的***的結果是,該類可以繼承 (extend)其它的類,而不是特定的適配器。現在我們進行實踐,移植MyInput類使其使用默認方法。因為我們現在能繼承其它類了,所以我們繼承一 個第三方的基礎類。我們這里不需要關心這個基礎類的作用,我們可以假設這個對我們的功能是有意義的。

  1. class MyInput extends ThirdPartyBaseClass implements SimpleInput { 
  2.   @Override 
  3.   public void foo() { 
  4.     // do something ... 
  5.   } 
  6.   @Override 
  7.   public void bar() { 
  8.     SimpleInput.super.bar(); 
  9.     // do something additionally ... 
  10.   } 

為了實現原始類相似的功能,我們使用Java 8的新的語法來調用指定接口的默認方法。同時,將我們方法中的一些邏輯移到基礎類中去。此時,你可能拍著我的肩膀說,這是一次非常好的重構

我們相當成功的使用了該庫。但是,維護人員需要增加另一個接口來提供更多的功能。該接口被 ComplexInput 接口所代替,這個接口繼承自 SimpleInput 接口,并增加了新的方法。因為默認方法通常來說是可以很安全的添加的,因此,維護人員覆蓋了 SimpleInput 的默認方法,提供了一個更好的默認方法。畢竟,這對于采用適配器類的方式來說是很平常的事情。

  1. interface ComplexInput extends SimpleInput { 
  2.   void qux(); 
  3.   @Override 
  4.   default void bar() { 
  5.     SimpleInput.super.bar(); 
  6.     // so complex, we need to do more ... 
  7.   } 

新的特性帶來了非常好的效果以至于維護 ThirdPartyBaseClass 的人也決定依賴該庫。為了完成這項工作,它在 ThirdPartyLibrary 中實現了 ComplexInput 接口。

但是這對 MyInput 類來說意味著什么呢?為了隱式的實現 ComplexInput 接口,可繼承 ThirdPartyBaseClass 類,但是調用 SimpleInput 的默認方法突然變成非法的了。結果,用戶的代碼不能通過編譯。現在這種調用是被禁止的,因為Java認為這種在非直接子類中調用父類的父類的方法是非法 的。你只能在 ComplexInput 中去調用該默認方法,但是,這要求你顯示的在MyInput中實現該接口。對于庫的用戶來說,這種改變不是所預期的!

更奇怪的是,Java運行時卻不做這種限制。JVM的校驗器是允許一個編譯好的類去調用 SimpleInput::foo 方法的,即使該類是通過繼承更新后的 ThirdPartyBaseClass,從而隱式的實現了ComplexClass。這種限制只存在于編譯器中。

我們從這里能學到什么東西呢?簡單的說,確保不要在一個接口中覆蓋另一個接口的默認方法,既不要用默認方法覆蓋,也不要用抽象方法覆蓋。總的來說, 請謹慎使用默認方法。即使它使得Java的集合接口API輕易的發生了革命性的變化,但本質上講,這種繼承層級之間的方法調用,增加系統的復雜性。而在 Java 7之前,你只需要沿著線性的類層級去查找真正調用的代碼。只有當你覺得非常有必要的時候才去增加這種復雜性。

責任編輯:王雪燕 來源: ImportNew
相關推薦

2020-12-16 07:37:35

Java代碼成本

2018-06-07 09:13:22

錯誤數據備份

2014-04-10 18:00:10

Java8Java8教程

2014-03-28 11:08:16

Java 8多重繼承

2020-02-26 21:57:09

Lambdajava8方法引用

2010-10-29 10:33:55

ORACLE默認用戶

2010-06-10 14:14:18

個MySQL表索引

2018-12-14 15:51:47

Pandas數據數據結構

2010-10-13 11:02:52

MySQL數據文件

2017-09-08 12:15:54

Python代碼Pythonic

2019-11-24 19:25:17

網絡安全邊緣計算攻擊

2023-07-27 10:24:54

數字化轉型NetOps

2024-12-23 08:10:00

Python代碼性能代碼

2021-03-04 08:14:37

Java8開發接口

2015-05-25 09:45:16

Java多繼承深入解析

2021-09-13 07:53:30

安全

2016-08-19 01:59:22

APPAPM用戶

2011-09-26 11:22:10

2011-04-06 16:39:01

默認數據庫

2013-11-18 09:18:40

代碼項目
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91在线看视频 | av网站免费观看 | 五月婷亚洲 | 不卡视频一区二区三区 | 午夜男人天堂 | 在线观看av网站 | 国产精品国产成人国产三级 | 粉嫩一区二区三区四区公司1 | 九九热在线观看 | 人人爽日日躁夜夜躁尤物 | 91精品国产91久久综合桃花 | 一区二区三区在线 | 欧美一区二区在线 | 色成人免费网站 | 亚洲视频中文字幕 | 色婷婷一区二区三区四区 | 中文字幕乱码一区二区三区 | 亚州精品天堂中文字幕 | 日韩av在线免费 | 伊人久久国产 | 国产欧美精品 | 精品免费国产一区二区三区四区介绍 | 一区二区av | 国产在线看片 | 久草福利 | 国产中文一区二区三区 | 永久av| 精品欧美一区二区中文字幕视频 | 久久精品欧美一区二区三区不卡 | 久久国产精品视频 | 日韩插插 | 久久精品网 | 日韩影院在线 | 久久久久亚洲 | 成人在线影视 | 亚洲毛片在线观看 | 国外成人在线视频 | eeuss国产一区二区三区四区 | 美女午夜影院 | 国产亚洲一区精品 | 免费视频99 |