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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

null相关

發(fā)布時間:2024/1/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 null相关 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文轉(zhuǎn)自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html?

null代表不確定的對象:

  Java中,null是一個關(guān)鍵字,用來標(biāo)識一個不確定的對象。因此可以將null賦給引用類型變量,但不可以將null賦給基本類型變量。

  Java中,變量的使用都遵循一個原則:先定義,并且初始化后,才可以使用。例如如下代碼中,我們不能定義int?age后,不給age指定值,就去打印age的值。這條對對于引用類型變量也是適用的(String name也同樣適用),在編譯的時候就會提示為初始化。

public class NullTest {public static void testNull(){int age;System.out.println("user age:"+age);long money;money=10L;System.out.println("user money"+money);String name;System.out.println("user name:"+name);} }

  在Java中,Java默認(rèn)給變量賦值:在定義變量的時候,如果定義后沒有給變量賦值,則Java在運行時會自動給變量賦值。賦值原則是整數(shù)類型int、byte、short、long的自動賦值為0,帶小數(shù)點的float、double自動賦值為0.0,boolean的自動賦值為false,其他各供引用類型變量自動賦值為null。上面代碼會變?yōu)槿缦驴蛇\行代碼:

public class NullTest {public static void testNull(){int age = 0;System.out.println("user Age:"+age);long money;money=10L;System.out.println("user money"+money);String name = null;System.out.println("user name:"+name);} }

  null本身不是對象,也不是Objcet的實例:

  null只是一個關(guān)鍵字,用來標(biāo)識一個不確定的對象,他既不是對象,也不是Objcet對象的實例。下面我們通過代碼確定一下null是不是Object對象實例:

public class NullTest {public static void main(String[] args) {testNullObject();}public static void testNullObject() {if (null instanceof java.lang.Object) {System.out.println("null屬于java.lang.Object類型");} else {System.out.println("null不屬于java.lang.Object類型");}} }

  運行上面代碼,輸出:null不屬于java.lang.Object類型,可見,null對象不是Object對象的實例。


?  null對象的使用:

  1.常見使用場景:

  有時候,我們定義一個引用類型變量,在剛開始的時候,無法給出一個確定的值,但是不指定值,程序可能會在try語句塊中初始化值。這時候,我們下面使用變量的時候就會報錯。這時候,可以先給變量指定一個null值,問題就解決了。例如:??

Connection conn = null;try {conn = DriverManager.getConnection("url", "user", "password");} catch (SQLException e) {e.printStackTrace();}String catalog = conn.getCatalog();

  如果剛開始的時候不指定conn = null,則最后一句就會報錯。

  2.容器類型與null:
???? List:允許重復(fù)元素,可以加入任意多個null。
???? Set:不允許重復(fù)元素,最多可以加入一個null。
???? Map:Map的key最多可以加入一個null,value字段沒有限制。
???? 數(shù)組:基本類型數(shù)組,定義后,如果不給定初始值,則java運行時會自動給定值。引用類型數(shù)組,不給定初始值,則所有的元素值為null。
?
?????3.null的其他作用
???? 1>、判斷一個引用類型數(shù)據(jù)是否null。 用==來判斷。
???? 2>、釋放內(nèi)存,讓一個非null的引用類型變量指向null。這樣這個對象就不再被任何對象應(yīng)用了。等待JVM垃圾回收機制去回收。

  4.null的使用建議:

  1>. 在Set或者Map中使用null作為鍵值指向的value,千萬別這么用。很顯然,在Set和Map的查詢操作中,將null作為特殊的例子可以使查詢結(jié)果更淺顯易懂。
  2>. 在Map中包含value是null值的鍵值對,你應(yīng)該把這種鍵值對移出map,使用一個獨立的Set來包含所有null或者非null的鍵。很容易混淆的是,一個Map是不是包含value是 null的key,還是說這個Map中沒有這樣的鍵值對。最好的辦法就是把這類key值分立開來,并且好好想想到底一個value是null的鍵值對對于你的程序來說到底意味著什么。
  3>. 在列表中使用null,并且這個列表的數(shù)據(jù)是稀疏的,或許你最好應(yīng)該使用一個Map<Integer,E>字典來代替這個列表。因為字典更高效,并且也許更加精確的符合你潛意識里對程序的需求。
  4>. 想象一下如果有一種自然的“空對象”可以使用,比方說對于枚舉類型,添加一個枚舉常數(shù)實例,這個實例用來表示你想用null值所表示的情形。比如:Java.math.RoundingMode有一個常數(shù)實例UNNECESSARY來表示“不需要四舍五入”,任何精度計算的方法若傳以RoundingMode.UNNECESSARY為參數(shù)來計算,必然拋出一個異常來表示不需要舍取精度。
  

  5.問題和困惑:

  首先,對于null的隨意使用會一系列難以預(yù)料的問題。通過對大量代碼的研究和分析,我們發(fā)現(xiàn)大概95%以上的集合類默認(rèn)并不接受null值,如果有null值將被放入集合中,代碼會立刻中斷并報錯而不是默認(rèn)存儲null值,對于開發(fā)來說,這樣能夠更加容易的定位程序出錯的地方。
  另外,null值是一種令人不滿的模糊含義。有的時候會產(chǎn)生二義性,這時候我們就很難搞清楚具體的意思,如果程序返回一個null值,其代表的含義到底是什么,例如:Map.get(key)若返回value值為null,其代表的含義可能是該鍵指向的value值是null,亦或者該鍵在map中并不存在。null值可以表示失敗,可以表示成功,幾乎可以表示任何情況。用其它一些值(而不是null值)可以讓你的代碼表述的含義更清晰。
  反過來說,使用null值在有些情況下是一種正確的選擇,因為從內(nèi)存消耗和效率方面考慮,使用null更加廉價,而且在對象數(shù)組中出現(xiàn)null也是不可避免的。但是在程序代碼中,比方說在函數(shù)庫中,null值的使用會變成導(dǎo)致誤解的元兇,也會導(dǎo)致一些莫名的,模糊的,很難修正的問題。就像上述map的例子,字典返回null可以代表的是該鍵指向的值存在且為空,或者也可以代表字典中沒有這個鍵。關(guān)鍵在于,null值不能指明到底null代表了什么含義。


  Guava的Optional:

  大多數(shù)情況下程序員使用null是為了表示某種不存在的意思,也許應(yīng)該有一個value,但是這個value是空或者這個value找不到。比方說,在用不存在的key值從map中取  value,Map.get返回null表示沒有該map中不包含這個key。 

  若T類型數(shù)據(jù)可以為null,Optional<T>是用來以非空值替代T數(shù)據(jù)類型的一種方法。一個Optional對象可以包含一個非空的T引用(這種情況下我們稱之為“存在的”)或者不包含任何東西(這種情況下我們稱之為“空缺的”)。但Optional從來不會包含對null值的引用。

import com.google.common.base.Optional;public class OptionalTest {public void testOptional() throws Exception { Optional<Integer> possible=Optional.of(6);if(possible.isPresent()){System.out.println("possible isPresent:"+possible.isPresent());System.out.println("possible value:"+possible.get());}} }

?

  由于這些原因,Guava庫設(shè)計了Optional來解決null的問題。許多Guava的工具被設(shè)計成如果有null值存在即刻報錯而不是只要上下文接受處理null值就默認(rèn)使用null值繼續(xù)運行。而且,Guava提供了Optional等一些工具讓你在不得不使用null值的時候,可以更加簡便的使用null并幫助你避免直接使用null。

  Optional<T>的最常用價值在于,例如,假設(shè)一個方法返回某一個數(shù)據(jù)類型,調(diào)用這個方法的代碼來根據(jù)這個方法的返回值來做下一步的動作,若該方法可以返回一個null值表示成功,或者表示失敗,在這里看來都是意義含糊的,所以使用Optional<T>作為返回值,則后續(xù)代碼可以通過isPresent()來判斷是否返回了期望的值(原本期望返回null或者返回不為null,其意義不清晰),并且可以使用get()來獲得實際的返回值。


  Optional方法說明和使用實例:

  1.常用靜態(tài)方法:

  Optional.of(T):獲得一個Optional對象,其內(nèi)部包含了一個非null的T數(shù)據(jù)類型實例,若T=null,則立刻報錯。
  Optional.absent():獲得一個Optional對象,其內(nèi)部包含了空值
  Optional.fromNullable(T):將一個T的實例轉(zhuǎn)換為Optional對象,T的實例可以不為空,也可以為空[Optional.fromNullable(null),和Optional.absent()等價。

  使用實例如下:

import com.google.common.base.Optional;public class OptionalTest {@Testpublic void testOptional() throws Exception { Optional<Integer> possible=Optional.of(6);Optional<Integer> absentOpt=Optional.absent();Optional<Integer> NullableOpt=Optional.fromNullable(null);Optional<Integer> NoNullableOpt=Optional.fromNullable(10);if(possible.isPresent()){System.out.println("possible isPresent:"+possible.isPresent());System.out.println("possible value:"+possible.get());}if(absentOpt.isPresent()){System.out.println("absentOpt isPresent:"+absentOpt.isPresent()); ;}if(NullableOpt.isPresent()){System.out.println("fromNullableOpt isPresent:"+NullableOpt.isPresent()); ;}if(NoNullableOpt.isPresent()){System.out.println("NoNullableOpt isPresent:"+NoNullableOpt.isPresent()); ;}} }

  2.實例方法:

  1>. boolean isPresent():如果Optional包含的T實例不為null,則返回true;若T實例為null,返回false
  2>. T get():返回Optional包含的T實例,該T實例必須不為空;否則,對包含null的Optional實例調(diào)用get()會拋出一個IllegalStateException異常
  3>. T or(T):若Optional實例中包含了傳入的T的相同實例,返回Optional包含的該T實例,否則返回輸入的T實例作為默認(rèn)值
  4>. T orNull():返回Optional實例中包含的非空T實例,如果Optional中包含的是空值,返回null,逆操作是fromNullable()
  5>. Set<T> asSet():返回一個不可修改的Set,該Set中包含Optional實例中包含的所有非空存在的T實例,且在該Set中,每個T實例都是單態(tài),如果Optional中沒有非空存在的T實例,返回的將是一個空的不可修改的Set。
  
使用實例如下:

import java.util.Set; import com.google.common.base.Optional;public class OptionalTest {public void testMethodReturn() {Optional<Long> value = method();if(value.isPresent()==true){System.out.println("獲得返回值: " + value.get()); }else{System.out.println("獲得返回值: " + value.or(-12L)); }System.out.println("獲得返回值 orNull: " + value.orNull());Optional<Long> valueNoNull = methodNoNull();if(valueNoNull.isPresent()==true){Set<Long> set=valueNoNull.asSet();System.out.println("獲得返回值 set 的 size : " + set.size()); System.out.println("獲得返回值: " + valueNoNull.get()); }else{System.out.println("獲得返回值: " + valueNoNull.or(-12L)); }System.out.println("獲得返回值 orNull: " + valueNoNull.orNull());}private Optional<Long> method() {return Optional.fromNullable(null);}private Optional<Long> methodNoNull() {return Optional.fromNullable(15L);}}

  輸出結(jié)果:

獲得返回值: -12 獲得返回值 orNull: null 獲得返回值 set 的 size : 1 獲得返回值: 15 獲得返回值 orNull: 15

  Optional除了給null值命名所帶來的代碼可閱讀性的提高,最大的好處莫過于Optional是傻瓜式的。Optional對象的使用強迫你去積極的思考這樣一種情況,如果你想讓你的程序返回null值,這null值代表的含義是什么,因為你想要取得返回值,必然從Optional對象內(nèi)部去獲得,所以你必然會這么去思考。但是只是簡單的使用一個Null值會很輕易的讓人忘記去思索代碼所要表達(dá)的含義到底是什么,盡管FindBugs有些幫助,但是我們還是認(rèn)為它并沒有盡可能的解決好幫助程序員去思索null值代表的含義這個問題。
  這種思考會在你返回某些存在的值或者不存在的值的時候顯得特別相關(guān)。和其他人一樣,你絕對很可能會忘記別人寫的方法method(a,b)可能會返回一個null值,就好像當(dāng)你去寫method(a,b)的實現(xiàn)時,你也很可能忘記輸入?yún)?shù)a也可以是null。如果返回的是Optional對象,對于調(diào)用者來說,就可以忘卻怎么去度量null代表的是什么含義,因為他們始終要從optional對象中去獲得真正的返回值。

轉(zhuǎn)載于:https://www.cnblogs.com/YDDMAX/p/4973305.html

總結(jié)

以上是生活随笔為你收集整理的null相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 美女激情av | 亚洲综合日韩精品欧美综合区 | 成人免费av网站 | 伊人春色在线观看 | 岛国一区 | 国产精品交换 | 亚洲高清视频一区二区 | 99热| 天天操天天摸天天干 | 亚洲欧洲日本一区二区三区 | 国产三级在线观看完整版 | 巨乳在线播放 | 香蕉网址| 麻豆传媒网站入口 | 国产日韩一区二区在线 | 蘑菇福利视频一区播放 | 男女视频免费观看 | av性天堂网| 成人在线免费视频播放 | 久久久久久久久久影院 | 精品一区中文字幕 | 激情五月婷婷丁香 | 美日韩成人av | 69视频国产 | 欧美精品影院 | 欧美xxxxx少妇 | 免费观看理伦片在线播放视频软件 | 日韩三级一区二区三区 | 四季av一区二区 | av资源新版在线天堂 | 封神榜二在线高清免费观看 | 午夜精品久久久久久久99热黄桃 | 久久久久久久影院 | 日日操夜夜操天天操 | 日韩国产欧美精品 | 日本超碰在线 | 免费看60分钟黄视频 | 欧美日本韩国一区 | 国产精品高潮呻吟久久久久久 | 成人性视频在线 | 色呦呦在线视频 | 久久久久国产精品一区二区 | 久久成人免费网站 | 爱爱视频在线免费观看 | 欧美综合图片 | 国产免费黄网站 | 少妇毛片视频 | 成人午夜高清 | 成人在线小视频 | 欧美成人一区二区 | 小视频在线观看 | av色成人 | 中文一二三区 | 日韩精品中文字幕在线 | 欧美三级视频 | 亚洲a级精品 | 欧美激情视频一区 | 欧美午夜精品久久久久久人妖 | 激情开心站 | 日日射天天操 | 国产又黄又粗又爽 | 日本一区二区黄色 | 成年人在线免费观看网站 | 久久午夜精品 | 在线只有精品 | 日日av| 乱短篇艳辣500篇h文最新章节 | 国产精品视频www | 亚洲欧美日韩一区二区三区四区 | 在线免费成人网 | 欧美特一级片 | 久久黄色片视频 | 性欧美日本 | 亚洲综合在线第一页 | 在线能看的av | 国产情侣91 | 日本一区二区在线观看视频 | 中文字幕在线观看 | 成人黄色免费网 | 亚洲精品午夜国产va久久成人 | www.av成人 | 国产一级一级片 | 亚洲中文字幕在线观看 | 午夜一区二区三区四区 | 老司机深夜福利网站 | 色欲久久久天天天综合网 | 国产午夜精品久久久久久久 | 国产伦精品一区二区三区免费视频 | www.亚洲黄色 | 超碰97人人爱 | 爱看av| 中文区中文字幕免费看 | 久久久久亚洲av无码麻豆 | 欧美日本精品 | 精品无码一区二区三区在线 | 2020自拍偷拍 | 绝顶高潮videos合集 | 亚洲无打码 | 99久久精品免费看国产免费软件 |