最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java正確使用訪問修飾符的姿勢

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

1、簡介

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

小捌溫馨總結(jié):

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

2、訪問修飾符

Java語法提供了四種級別的訪問修飾符,作用于域、方法、類、接口,它們的可訪問性如下所示:

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

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

3、原則

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

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

這會導致一個什么問題呢?在組件對外公布的時候或者迭代更新的時候,需要不斷的顛覆以前的設計,把更多的API對外公出來,但是總的來說這也好過把類中所有成員都用public修飾,這種方式是完全不能接收的,兄弟們。

那問題來了,具體應該怎么搞呢?

其實小捌覺得只需要明白三個點,因為訪問修飾符作用于類、方法、屬性;所以針對如下三者分析它們應該怎么選擇訪問修飾符。

對于類來說有如下規(guī)則:

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

對于方法來說有如下規(guī)則:

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

對于屬性來說有如下規(guī)則:

  1. 如果類是共有的,一定不能將實例域公開;因為一旦公開實例域,等于其他類中可以修改這個實例域,無法保證實例域的安全性
  2. 如果屬性能夠定義為常量,我們一定要使用static final進行修飾,這樣對外暴露的域具有較高安全性。注意不要在常量域中定義數(shù)組等可變對象。

關于常量域中定義數(shù)組對象帶來的危險性,小捌做個Demo演示

定義Person對象:

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ù)組域所屬類:

public class PersonDemo {

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

}

測試代碼:

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);

    }

}

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

關于這種方式的處理也很簡單,可以將數(shù)組域私有化,并且提供一個API來訪問數(shù)組的拷貝

public class PersonDemo {

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

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

}

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

此外也可以使用Collections工具類將其包裝為不可變集合,包裝成UnmodifiableCollection對象之后,set、add、remove等方法調(diào)用會拋出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é)

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

相關文章

  • 解決Java處理HTTP請求超時的問題

    解決Java處理HTTP請求超時的問題

    這篇文章主要介紹了解決Java處理HTTP請求超時的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Spring?多數(shù)據(jù)源方法級別注解實現(xiàn)過程

    Spring?多數(shù)據(jù)源方法級別注解實現(xiàn)過程

    多數(shù)據(jù)源管理是Spring框架中非常重要的一部分,它可以提高應用程序的靈活性和可靠性,從而更好地滿足業(yè)務需求,這篇文章主要介紹了Spring?多數(shù)據(jù)源方法級別注解實現(xiàn),需要的朋友可以參考下
    2023-07-07
  • Java面試題沖刺第十七天--基礎篇3

    Java面試題沖刺第十七天--基礎篇3

    這篇文章主要為大家分享了最有價值的三道java基礎面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 深入了解Java核心類庫--Arrays類

    深入了解Java核心類庫--Arrays類

    這篇文章主要為大家詳細介紹了java Arrays類定義與使用的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07
  • JAVA匿名內(nèi)部類語法分析及實例詳解

    JAVA匿名內(nèi)部類語法分析及實例詳解

    這篇文章主要介紹了JAVA匿名內(nèi)部類語法分析及實例詳解,匿名內(nèi)部類可以使你的代碼更加簡潔,它與局部類很相似,不同的是它沒有類名,如果某個局部類你只需要用一次,那么你就可以使用匿名內(nèi)部類。對此感興趣的可以了解一下
    2020-07-07
  • springboot集成kafka消費手動啟動停止操作

    springboot集成kafka消費手動啟動停止操作

    這篇文章主要介紹了springboot集成kafka消費手動啟動停止操作,本文給大家介紹項目場景及解決分析,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • SpringBoot多數(shù)據(jù)源切換實現(xiàn)代碼(Mybaitis)

    SpringBoot多數(shù)據(jù)源切換實現(xiàn)代碼(Mybaitis)

    實際工作中我們會遇到springboot項目初始化啟動時候,不能指定具體連接哪個數(shù)據(jù)源的時候,不同的接口連接不同的數(shù)據(jù)源或者前端頁面指定連接某個數(shù)據(jù)源等等情況,就會遇到動態(tài)數(shù)據(jù)源切換的問題,需要的朋友可以參考下
    2022-04-04
  • JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類

    JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類

    這篇文章主要介紹了JPA如何使用nativequery多表關聯(lián)查詢返回自定義實體類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案

    這篇文章主要介紹了Spring Boot Mail QQ企業(yè)郵箱無法連接解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • 解決SpringMVC接收不到ajaxPOST參數(shù)的問題

    解決SpringMVC接收不到ajaxPOST參數(shù)的問題

    今天小編就為大家分享一篇解決SpringMVC接收不到ajaxPOST參數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論

浪卡子县| 大渡口区| 治县。| 城步| 安徽省| 兴仁县| 喀喇| 新乐市| 浦东新区| 吉安县| 安徽省| 绥化市| 正镶白旗| 手机| 大方县| 新田县| 绍兴市| 张北县| 夏河县| 余庆县| 惠来县| 山西省| 措勤县| 东阳市| 平远县| 侯马市| 崇左市| 三江| 临海市| 阆中市| 宜黄县| 宜君县| 黑山县| 娄底市| 隆德县| 陵川县| 霍山县| 铜鼓县| 德昌县| 湟源县| 洛川县|