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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

你应该更新的Java知识

發(fā)布時間:2025/4/16 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你应该更新的Java知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接:http://www.blogbus.com/dreamhead-logs/236028457.html

你應(yīng)該更新的Java知識之常用程序庫(一)
你應(yīng)該更新的Java知識之常用程序庫(二)
你應(yīng)該更新的Java知識之構(gòu)建工具
你應(yīng)該更新的Java知識之Observer
你應(yīng)該更新的Java知識之集合初始化
你應(yīng)該更新的Java知識之集合操作
你應(yīng)該更新的Java知識之惰性求值
你應(yīng)該更新的Java知識之Optional
你應(yīng)該更新的Java知識之Optional高級用法

在傳統(tǒng)的Java里,為了表示一個集合,我們常常會寫出這樣的代碼:

public class People {private List people;public void setPeople(List people) {this.people = people;}public List getPeople() {return this.people;}... }

嚴格說來,這樣的代碼存在缺陷。雖然貌似List被封裝到People里,但實際上,這個List的引用卻暴露在外面,這個類的用戶可以輕松地拿到List的引用,隨意修改。所以,下面是一種更嚴謹?shù)膶懛?#xff1a;

public class People {private List people;public void setPeople(List people) {this.people.addAll(people);}@SuppressWarnings("unchecked")public List getPeople() {return (List)this.people.clone();} ... }

這里的做法基本思路是,做一個副本,保證內(nèi)部引用(這里的people)不會傳播到外面。但在實際編寫代碼的時候,大多數(shù)人都不會這么做,能否意識到這樣的問題只是一個方面,這樣的代碼寫起來,也要比原來的那種寫法麻煩得多。按照許多公司的做法,這種要求只能放到代碼規(guī)范里,但無論如何,在程序世界里,人為規(guī)定永遠是最容易忽略的約定。

不過,在真實世界中,即便是我們寫的只是上面的最簡單那種形式,卻很少出現(xiàn)問題。原因何在呢?因為大多數(shù)情況下,我們編寫這樣程序的時候,會有一種隱形的約定,這個“List”是不變的。我們設(shè)置(set)完這個List之后,基本上不會留著它的引用在做任何操作;而得到(get)它之后,也基本上不會去修改它。

在這種情況下,我們使用的實際上是一個不變的List。既然是一個不變的List,那不如就更直接地把它表現(xiàn)出來。

Guava為我們提供了不變集合的概念,對應(yīng)著各種具體類型,有ImmutableList、ImmutableSet,還有ImmutableMap。從名字上,我們不難看出它們的用法。

Guava不變集合的做法并不是另起爐灶,而是遵循了Java已有集合框架的約定。比如,通過查閱文檔,我們不難發(fā)現(xiàn),ImmutableList就是一個List,只不過使用這個“List”,只不過,當(dāng)我們嘗試調(diào)用諸如add、set之類試圖修改集合的方法時,它會拋出異常。正是有了這樣的基礎(chǔ),不變集合可以和很多已有的類庫、框架配合在一起。

有了這個基礎(chǔ),我們把不變集合的概念應(yīng)用于之前的代碼,它就是下面這個樣子:

public class People {private ImmutableList people;public void setPeople(ImmutableList people) {this.people = people;}public ImmutableList getPeople() {return this.people;} ... }

這樣一來,代碼依然很簡單,但是,意義卻與從前完全不一樣了。我們不必再為可能存在的隱憂顧慮了:一旦元素放到集合里,就不可能修改它了,因為它是不可變的。

對于使用這段代碼的人來說,getter自不必說,如往常一樣使用,setter也不費力。只是當(dāng)做字面量使用的集合,我們已經(jīng)在《你應(yīng)該更新的Java知識之集合初始化》中討論過了。如果要適配于現(xiàn)有程序庫,把一個已有的List轉(zhuǎn)成ImmutableList也不復(fù)雜,一個簡單的copyOf方法就可以實現(xiàn):

List existingPeople = ... ImmutableList immutablePeople = copyOf(existingPeople);

為了讓討論更完整,這里不得不提到另外一個不變接口的選擇:Iterable。它是從Java 5開始進入JDK的一個接口:

public interface Iterable {Iterator iterator(); }

作為一個Java程序員,我們對Iterator簡直再熟悉不過了,有了Iterator,我們就可以遍歷一個集合。所以,在一些情況下,我們也可以使用Iterable表示一個不變集合。大多數(shù)Java已有的集合類都實現(xiàn)了這個接口。

既然它是JDK里的東西,為什么不把它優(yōu)先推薦呢?原因有幾個。最重要的一個原因在于我們熟知的Iterator,它有一個方法叫做remove,可能大多數(shù)Java程序員已經(jīng)習(xí)慣性地忽略了這個方法,但它就在哪里,它是一個可以“改變”集合的方法,所以,從語義上說,它不是一個很好的選擇。另外,從已有的代碼習(xí)慣來說,很多程序員還是很喜歡用List、Set作為接口,所以,ImmutableList從心理上來說,更接近已有的習(xí)慣。剩下的一個點似乎不那么重要,有些代碼真的需要使用到特定類型的接口。不過,就大多數(shù)代碼而言,我們只是要得到的一個集合,做一些操作,而這些操作我們在《你應(yīng)該更新的Java知識之集合操作》中做了一些討論。

在函數(shù)式編程中,不變是提升程序穩(wěn)定性一個很重要的概念。既然我們大多數(shù)情況下實際用到的是不變集合,那就不妨直接把它表現(xiàn)出來。

總結(jié)

以上是生活随笔為你收集整理的你应该更新的Java知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。