欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java正確使用訪問(wèn)修飾符的姿勢(shì)

 更新時(shí)間:2021年11月03日 11:42:49   作者:李子捌  
訪問(wèn)修飾符是Java語(yǔ)法中很基礎(chǔ)的一部分,但是能正確的使用Java訪問(wèn)修飾符的程序員只在少數(shù),下面這篇文章主要給大家介紹了關(guān)于Java正確使用訪問(wèn)修飾符的姿勢(shì),需要的朋友可以參考下

1、簡(jiǎn)介

訪問(wèn)修飾符是Java語(yǔ)法中很基礎(chǔ)的一部分,但是能正確的使用Java訪問(wèn)修飾符的程序員只在少數(shù)。在Java組件開(kāi)發(fā)中,如果能夠恰到好處的使用訪問(wèn)修飾符,就能很好的隱藏組件內(nèi)部數(shù)據(jù)和不必公布的實(shí)現(xiàn)細(xì)節(jié),從而把組件API和實(shí)現(xiàn)細(xì)節(jié)隔離;正確的使用訪問(wèn)修飾符開(kāi)發(fā)的Java組件,在組件與組件的調(diào)用和依賴(lài)過(guò)程中,也能很好的解耦程序,以至于整個(gè)組件能夠持續(xù)開(kāi)發(fā)、持續(xù)測(cè)試、持續(xù)更新。

小捌溫馨總結(jié):

  1. 通過(guò)限制訪問(wèn)范圍達(dá)到信息隱藏或封裝的效果,保證程序?qū)崿F(xiàn)細(xì)節(jié)的安全
  2. 解耦組件,使得組件之間的耦合關(guān)系降低,從而能夠低成本、低風(fēng)險(xiǎn)(不影響其他組件)的迭代

2、訪問(wèn)修飾符

Java語(yǔ)法提供了四種級(jí)別的訪問(wèn)修飾符,作用于域、方法、類(lèi)、接口,它們的可訪問(wèn)性如下所示:

訪問(wèn)修飾符 名稱(chēng) 訪問(wèn)性
private 私有的 聲明該成員的類(lèi)才可以訪問(wèn)。注意:頂層類(lèi)不能被private和protected修飾,內(nèi)部類(lèi)可以
default/package-private 包級(jí)私有的 聲明該成員的類(lèi)同一包下的任何類(lèi)均可以訪問(wèn)
protected 受保護(hù)的 聲明該成員的類(lèi)同一包下、子類(lèi)可以訪問(wèn)
public 共有的 任何地方均可訪問(wèn)

注意:private和default并不是絕對(duì)安全,如果類(lèi)實(shí)現(xiàn)了Serializable,這些被private和defaulte修飾的域同一可能被導(dǎo)出;其次反射也是可以跨過(guò)訪問(wèn)修飾符的限制。

3、原則

Java訪問(wèn)修飾符使用的原則非常簡(jiǎn)單:在實(shí)現(xiàn)Java組件的過(guò)程中,保證組件功能一致的同時(shí),盡可能讓類(lèi)、類(lèi)成員不被外界訪問(wèn)。

這一條規(guī)則看似非常簡(jiǎn)單,但是往往給讓程序員產(chǎn)生一種誤導(dǎo),他把類(lèi)所有的方法和屬性都不假思索的設(shè)置為private。

這會(huì)導(dǎo)致一個(gè)什么問(wèn)題呢?在組件對(duì)外公布的時(shí)候或者迭代更新的時(shí)候,需要不斷的顛覆以前的設(shè)計(jì),把更多的API對(duì)外公出來(lái),但是總的來(lái)說(shuō)這也好過(guò)把類(lèi)中所有成員都用public修飾,這種方式是完全不能接收的,兄弟們。

那問(wèn)題來(lái)了,具體應(yīng)該怎么搞呢?

其實(shí)小捌覺(jué)得只需要明白三個(gè)點(diǎn),因?yàn)樵L問(wèn)修飾符作用于類(lèi)、方法、屬性;所以針對(duì)如下三者分析它們應(yīng)該怎么選擇訪問(wèn)修飾符。

對(duì)于類(lèi)來(lái)說(shuō)有如下規(guī)則:

  1. 接口沒(méi)得選,默認(rèn)就是public
  2. 頂層普通類(lèi),我們可以選擇public和default,此時(shí)應(yīng)該著重考慮這個(gè)頂層類(lèi)是否只是在當(dāng)前包中提供的抽象,如果滿足這個(gè)條件就可以好不由于的設(shè)置為default,但是如果這個(gè)頂層類(lèi)需要被包外其他類(lèi)直接使用,那就只能設(shè)置為public
  3. 非頂層普通類(lèi),這種類(lèi)主要是內(nèi)部類(lèi),內(nèi)部類(lèi)有匿名內(nèi)部類(lèi)、非匿名內(nèi)部類(lèi);匿名內(nèi)部類(lèi)不考慮;非匿名內(nèi)部類(lèi)又有靜態(tài)內(nèi)部類(lèi)和非靜態(tài)內(nèi)部類(lèi),這兩者在選擇訪問(wèn)修飾符的時(shí)候小捌認(rèn)為沒(méi)有區(qū)別,盡可能的選擇私有,因?yàn)槟愣紝⑺O(shè)計(jì)為內(nèi)部類(lèi),說(shuō)明這個(gè)類(lèi)抽象就是給外層類(lèi)提供抽象支持的;所以處于組件設(shè)計(jì)安全性考慮,盡可能設(shè)計(jì)為私有,如果在外部需要使用,可以通過(guò)外層類(lèi)提供API訪問(wèn)。

對(duì)于方法來(lái)說(shuō)有如下規(guī)則:

  1. 接口方法沒(méi)得選,默認(rèn)public,根據(jù)里氏替換原則,任何使用超類(lèi)的地方均可以使用子類(lèi)實(shí)例,子類(lèi)的訪問(wèn)修飾符必須大于等于超類(lèi),所以子類(lèi)也只有public一種選擇
  2. 普通類(lèi)方法,設(shè)計(jì)類(lèi)之前要先設(shè)計(jì)類(lèi)需要對(duì)外公布的API,也就是類(lèi)需要對(duì)外提供那些功能/服務(wù),這個(gè)一定要先于寫(xiě)代碼之前設(shè)計(jì)好,之后我們?cè)倏紤]將這些API設(shè)計(jì)為default、protected、public,關(guān)于具體細(xì)節(jié)必須使用private修飾

對(duì)于屬性來(lái)說(shuō)有如下規(guī)則:

  1. 如果類(lèi)是共有的,一定不能將實(shí)例域公開(kāi);因?yàn)橐坏┕_(kāi)實(shí)例域,等于其他類(lèi)中可以修改這個(gè)實(shí)例域,無(wú)法保證實(shí)例域的安全性
  2. 如果屬性能夠定義為常量,我們一定要使用static final進(jìn)行修飾,這樣對(duì)外暴露的域具有較高安全性。注意不要在常量域中定義數(shù)組等可變對(duì)象。

關(guān)于常量域中定義數(shù)組對(duì)象帶來(lái)的危險(xiǎn)性,小捌做個(gè)Demo演示

定義Person對(duì)象:

public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Person{" +
            "name='" + name + ''' +
            '}';
    }
}

定義數(shù)組域所屬類(lèi):

public class PersonDemo {

    public static final Person[] PERSONS = new Person[] {new Person("李子柒"), new Person("李子捌")};

}

測(cè)試代碼:

class Test {

    public static void main(String[] args) {

        Arrays.stream(PersonDemo.PERSONS).forEach(System.out::println);
        for (int i = 0; i < PersonDemo.PERSONS.length; i++) {
            PersonDemo.PERSONS[i] = new Person(PersonDemo.PERSONS[i].getName() + "被修改啦!");
        }
        System.out.println();
        Arrays.stream(PersonDemo.PERSONS).forEach(System.out::println);

    }

}

測(cè)試結(jié)果可以看出,數(shù)組內(nèi)容被修改了,這往往不是我們定義一個(gè)常量時(shí)所希望看到的。

關(guān)于這種方式的處理也很簡(jiǎn)單,可以將數(shù)組域私有化,并且提供一個(gè)API來(lái)訪問(wèn)數(shù)組的拷貝

public class PersonDemo {

    private static final Person[] PERSONS = new Person[] {new Person("李子柒"), new Person("李子捌")};

    public static final Person[] getPersons() {
        return PERSONS.clone();
    }

}

此時(shí)外部無(wú)法直接訪問(wèn)PERSONS數(shù)組,訪問(wèn)的只是數(shù)組的拷貝,修改的也只是數(shù)組的拷貝,無(wú)法修改到數(shù)組域的內(nèi)容。

此外也可以使用Collections工具類(lèi)將其包裝為不可變集合,包裝成UnmodifiableCollection對(duì)象之后,set、add、remove等方法調(diào)用會(huì)拋出UnsupportedOperationException:

public class PersonDemo {

    private static final Person[] PERSONS = new Person[] {new Person("李子柒"), new Person("李子捌")};

    public static final List<Person> getPersons() {
        return Collections.unmodifiableList(Arrays.asList(PERSONS));
    }

}

總結(jié)

到此這篇關(guān)于Java正確使用訪問(wèn)修飾符的文章就介紹到這了,更多相關(guān)Java使用訪問(wèn)修飾符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析

    Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Spring中@DependsOn注解的作用及實(shí)現(xiàn)原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Spring的Aware接口你知道多少

    Spring的Aware接口你知道多少

    這篇文章主要為大家詳細(xì)介紹了Spring的Aware接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • Java實(shí)現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件

    Java實(shí)現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件

    與TXT文本文件,PDF文件更加專(zhuān)業(yè)也更適合傳輸,所以這篇文章小編主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)將TXT文本文件轉(zhuǎn)換為PDF文件 ,需要的可以參考下
    2024-02-02
  • java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能

    java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 一文帶你探究Spring中Bean的線程安全性問(wèn)題

    一文帶你探究Spring中Bean的線程安全性問(wèn)題

    很多人都想spring中的bean是線程安全的嗎?本文將帶你探究Spring中Bean的線程安全性問(wèn)題,感興趣的同學(xué)可以參考閱讀下
    2023-05-05
  • SpringBoot服務(wù)設(shè)置禁止server.point端口的使用

    SpringBoot服務(wù)設(shè)置禁止server.point端口的使用

    本文主要介紹了SpringBoot服務(wù)設(shè)置禁止server.point端口的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Python學(xué)習(xí)之書(shū)寫(xiě)格式及變量命名

    Python學(xué)習(xí)之書(shū)寫(xiě)格式及變量命名

    這篇文章我們給大家總結(jié)了關(guān)于Python書(shū)寫(xiě)格式及變量命名,小編覺(jué)得這篇文章寫(xiě)的還不錯(cuò),有興趣的朋友跟著參考學(xué)習(xí)下,希望能夠給你帶來(lái)幫助
    2021-10-10
  • java  Swing基礎(chǔ)教程之圖形化實(shí)例代碼

    java Swing基礎(chǔ)教程之圖形化實(shí)例代碼

    這篇文章主要介紹了java Swing基礎(chǔ)教程之圖形化實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java實(shí)現(xiàn)二分查找樹(shù)及其相關(guān)操作

    Java實(shí)現(xiàn)二分查找樹(shù)及其相關(guān)操作

    二分查找樹(shù)是一種有組織的二叉樹(shù)。我們可以通過(guò)鏈接節(jié)點(diǎn)表示這樣一棵樹(shù),二分查找樹(shù)(Binary Search Tree)的基本操作有搜索、求最大值、求最小值、求前驅(qū)、求后繼、插入及刪除,對(duì)java二分查找樹(shù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-07-07
  • Java中ThreadLocal?導(dǎo)致內(nèi)存?OOM?的原因分析

    Java中ThreadLocal?導(dǎo)致內(nèi)存?OOM?的原因分析

    這篇文章主要介紹了Java中ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,文章基于Java的相關(guān)內(nèi)容展開(kāi)ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,需要的小伙v阿布可以參考一下
    2022-05-05

最新評(píng)論