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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

java

Java性能优化(12):最小化类和成员可访问能力

發(fā)布時(shí)間:2025/5/22 java 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java性能优化(12):最小化类和成员可访问能力 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

類和接口是Java程序設(shè)計(jì)語(yǔ)言的核心,它們也是Java語(yǔ)言的基本抽象單元。Java語(yǔ)言提供了許多強(qiáng)大的基本元素,供程序猿來(lái)設(shè)計(jì)類和接口。

要想?yún)^(qū)別一個(gè)設(shè)計(jì)良好的模塊與一個(gè)設(shè)計(jì)不好的模塊,最重要的因素是,這個(gè)模塊對(duì)于外部其他模塊而言,是否隱藏了內(nèi)部的數(shù)據(jù)和其他的實(shí)現(xiàn)細(xì)節(jié)。一個(gè)設(shè)計(jì)良好的模塊會(huì)隱藏所有的實(shí)現(xiàn)細(xì)節(jié),把它的API與實(shí)現(xiàn)清晰的隔離開來(lái)。然后,模塊之間只通過(guò)它們的API進(jìn)行通信,一個(gè)模塊不需要知道其他模塊內(nèi)部的工作情況,也就是所謂的封裝。

封裝之所以非常重要有許多理由,其中大多數(shù)理由都源于這樣一個(gè)事實(shí):它可以有效地解除一個(gè)系統(tǒng)中各模塊之間的耦合關(guān)系,使得這些模塊可以被獨(dú)立地開發(fā)、測(cè)試、優(yōu)化、使用、理解和修改。這樣可以加速系統(tǒng)開發(fā)的速度,因?yàn)檫@些模塊可以被并行地開發(fā)。它也減輕了維護(hù)的負(fù)擔(dān),因?yàn)槌绦騿T很快就可以理解這些模塊,并且在調(diào)試它們的時(shí)候可以不傷害其他的模塊。雖然封裝本身無(wú)論是對(duì)內(nèi)還是對(duì)外,都不會(huì)帶來(lái)更好的性能,但是它使得有效的性能調(diào)節(jié)成為可能。一旦一個(gè)系統(tǒng)已經(jīng)完成,通過(guò)分析就可以知道哪些模塊影響了系統(tǒng)的性能,那么這些模塊可以被進(jìn)一步優(yōu)化,而不會(huì)影響到其他模塊的正確性。封裝可以提高軟件的可重用性,因?yàn)閱为?dú)的模塊并不依賴于其他的模塊,除了開發(fā)這些模塊所使用的環(huán)境之外,它們?cè)谄渌h(huán)境中往往是有用。最后,封裝也降低了構(gòu)建大型系統(tǒng)的風(fēng)險(xiǎn);即使整個(gè)系統(tǒng)并不成功,這些獨(dú)立模塊也有可能是成功的。

Java程序設(shè)計(jì)語(yǔ)言提供了許多設(shè)施來(lái)幫助坐到信息隱藏。其中一個(gè)設(shè)施是訪問(wèn)控制機(jī)制,它決定了類、接口和成員的可訪問(wèn)性。

一個(gè)實(shí)體的可訪問(wèn)性是由該實(shí)體聲明所在的位置,以及該實(shí)體聲明中所出現(xiàn)的訪問(wèn)修飾符公同決定的。正確地使用這些修飾符對(duì)于實(shí)現(xiàn)封裝是非常關(guān)鍵的。

經(jīng)驗(yàn)表明,你應(yīng)該盡可能地使每一個(gè)類或成員不被外界訪問(wèn)。換句話說(shuō),你應(yīng)該使用時(shí)最低可能的、并且與該軟件的正確功能相一致的訪問(wèn)級(jí)別。

對(duì)于頂層的類和接口,它們只有兩種可能的訪問(wèn)級(jí)別:包級(jí)私有的和公有的。如果你聲明了一個(gè)具有public修飾符的頂層類或者接口,那么它是公有的;否則,它將是包級(jí)私有的。如果一個(gè)類或者接口能被做成包級(jí)私有的,那么它就應(yīng)該被做成包級(jí)私有的。通過(guò)把一個(gè)類或接口做成包級(jí)私有的,它實(shí)際上成了這個(gè)包的實(shí)現(xiàn)的一部分,而不是該包導(dǎo)出API的一部分;并且,在以后的發(fā)行版本中,你可以對(duì)它進(jìn)行修改、替換,或者去除,而無(wú)需擔(dān)心會(huì)傷害到現(xiàn)有的客戶。如果你把它做成公有的,你就有義務(wù)永遠(yuǎn)支持它,以保持兼容性。

如果一個(gè)包級(jí)私有的頂層類或接口只是在某一個(gè)類的內(nèi)部被用到,那么你應(yīng)該考慮使它成為后者的一個(gè)私有嵌套類。這樣可以進(jìn)一步降低它的可訪問(wèn)性,然而,這樣做不像”使一個(gè)不必要的共公有類成為包級(jí)私有的類”那樣重要,因?yàn)橐粋€(gè)包級(jí)私有的類已經(jīng)是這個(gè)包的實(shí)現(xiàn)的一部分,而不是其API的一部分。

對(duì)于成員有四種可能訪問(wèn)級(jí)別,下面按照可訪問(wèn)性遞增的順序列出來(lái):

  • 私有的——只有在聲明該成員的頂層類內(nèi)部才可以訪問(wèn)這個(gè)成員

  • 包級(jí)私有的——聲明該成員的包內(nèi)部的任何類都可以訪問(wèn)這個(gè)成員。在技術(shù)上,它被稱為”默認(rèn)訪問(wèn)級(jí)別”,如果沒有為成員指定訪問(wèn)修飾符的話,那么它就具有這樣的訪問(wèn)級(jí)別。

  • 受保護(hù)的——該成員聲明所在類的子類可以訪問(wèn)這個(gè)成員,并且,該成員聲明所在的包內(nèi)部的任何類也可以訪問(wèn)這個(gè)成員。

  • 公有的——任何地方都可以訪問(wèn)該成員。
    當(dāng)你仔細(xì)地設(shè)計(jì)了一個(gè)類的公有API之后,接下去應(yīng)該把所有其他的成員都變成私有的。只有當(dāng)同一個(gè)包內(nèi)的另一個(gè)類真正需要訪問(wèn)一個(gè)成員的時(shí)候,你才應(yīng)該去掉private修飾符,使該成員變成包級(jí)私有的。如果你發(fā)現(xiàn)自己經(jīng)常要做這樣的事情,那么你應(yīng)該重新檢查你的系統(tǒng)設(shè)計(jì),看看是否另一種分解方案所得到的類具有更好的分離特性,彼此之間耦合度更小??梢赃@樣說(shuō),私有成員和包級(jí)私有成員都是一個(gè)類實(shí)現(xiàn)中的一部分,并不會(huì)影響到其導(dǎo)出的API。然而,如果這些域所在類是實(shí)現(xiàn)了Serializable接口,那么這些域可能會(huì)被”泄露”其導(dǎo)出的API中。

對(duì)于公有類的成員,當(dāng)訪問(wèn)級(jí)別從包級(jí)私有變成保護(hù)級(jí)別時(shí),會(huì)出現(xiàn)可訪問(wèn)性的巨大增加。受保護(hù)成員是一個(gè)類導(dǎo)出API的一部分,必須永遠(yuǎn)被支持。更進(jìn)一步,一個(gè)導(dǎo)出的類的每一個(gè)受保護(hù)成員代表了該類對(duì)于一個(gè)實(shí)現(xiàn)細(xì)節(jié)的公開承諾。受保護(hù)的成員應(yīng)該盡量少用。

有一條規(guī)則使得你無(wú)法降低一個(gè)方法的可訪問(wèn)性。如果一個(gè)方法改寫了超類中的一個(gè)方法,那么子類中該方法的訪問(wèn)級(jí)別低于超類中的訪問(wèn)級(jí)別時(shí)不允許的。這樣可以確保子類實(shí)例可以被用在任何可使用超類的實(shí)例的場(chǎng)合。如果你違反了這條規(guī)則,那么當(dāng)你試圖編譯該子類的時(shí)候,編譯器會(huì)產(chǎn)生一條錯(cuò)誤信息。這條規(guī)則的一種特殊情形是,如果一個(gè)類實(shí)現(xiàn)了一個(gè)接口,那么接口中所有的方法在這個(gè)類中都必須被聲明為公有的。這是因?yàn)榻涌谥兴蟹椒ǘ茧[含著公有訪問(wèn)級(jí)別。

公有類應(yīng)該盡可能地包含公有的域。如果一個(gè)域是非final的,或者是一個(gè)指向可變對(duì)象的final引用,那么你一旦使它成為公有的,就放棄了對(duì)存儲(chǔ)在這個(gè)域中的值進(jìn)行限制的能力;當(dāng)這個(gè)域被修改的時(shí)候,你也失去了采取任何行動(dòng)的能力。一個(gè)簡(jiǎn)單的后果是,包含公有可變域的類不是線程安全地的。即使一個(gè)域是final的,并沒有指向任何一個(gè)可變對(duì)象,那么,一旦你把這個(gè)域變成公有的,也就放棄了“切換到一個(gè)新的內(nèi)部數(shù)據(jù)表示”的靈活性。

對(duì)于“公有類不應(yīng)該包含公有域”這條規(guī)則也有一個(gè)例外,通過(guò)公有的靜態(tài)final域來(lái)暴露類的常量是允許的。按照慣例,這樣域的名字由大寫字母組成,單詞之間用下劃線隔開。很重要的一點(diǎn)是,這些域要么包含原語(yǔ)類型的值,要么包含指向非可變對(duì)象的引用。如果一個(gè)final域包含一個(gè)指向可變對(duì)象的引用,那么它具有非final域的所有缺點(diǎn)。雖然引用本身不能被修改,但是它引用的對(duì)象可以被修改——這會(huì)導(dǎo)致災(zāi)難性的后果。

注意,非零長(zhǎng)度的數(shù)組總是可變的,所以,具有公有的靜態(tài)final數(shù)組域幾乎總是錯(cuò)誤的。如果一個(gè)類包含這樣的一個(gè)域,客戶將能夠修改數(shù)組中的內(nèi)容。這是安全漏洞中的一個(gè)常見根源:

public static final Type[] VALUES = {...}; private static final Type[] PRIVATE_VALUES ={...}; public static final List VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

另一種辦法是,如果你要求編譯時(shí)的類型的安全性,并且愿意損失一點(diǎn)性能的話,你可以把公有的數(shù)組替換成一個(gè)公有的辦法,它返回私有數(shù)組的一份拷貝:

private static final Type [] PRIVATE_VALUES = {...}; public static final Type [] values(){ return (Type[])PRIVATE_VALUES.clone(); }

總之,你應(yīng)該總會(huì)可能地降低可訪問(wèn)性,再仔細(xì)設(shè)計(jì)了一個(gè)最小的公有API之后,應(yīng)該防止把任何雜散的類、接口和成員變成API的一部分。除了公有靜態(tài)final域的特殊情形之外,公有類不應(yīng)該包含公有域。并且確保公有靜態(tài)final域所引用對(duì)象是不可變的。

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

總結(jié)

以上是生活随笔為你收集整理的Java性能优化(12):最小化类和成员可访问能力的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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