国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java正確使用訪問修飾符的姿勢

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

2022-03-10 00:42李子捌 Java教程

訪問修飾符是Java語法中很基礎(chǔ)的一部分,但是能正確的使用Java訪問修飾符的程序員只在少數(shù),下面這篇文章主要給大家介紹了關(guān)于Java正確使用訪問修飾符的姿勢,需要的朋友可以參考下

1、簡介

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

小捌溫馨總結(jié):

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

2、訪問修飾符

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

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

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

3、原則

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

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

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

那問題來了,具體應(yīng)該怎么搞呢?

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

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

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

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

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

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

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

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

定義Person對(duì)象:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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ù)組域所屬類:

?
1
2
3
4
5
public class PersonDemo {
 
    public static final Person[] PERSONS = new Person[] {new Person("李子柒"), new Person("李子捌")};
 
}

測試代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)容被修改了,這往往不是我們定義一個(gè)常量時(shí)所希望看到的。

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

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

?
1
2
3
4
5
6
7
8
9
public class PersonDemo {
 
    private static final Person[] PERSONS = new Person[] {new Person("李子柒"), new Person("李子捌")};
 
    public static final Person[] getPersons() {
        return PERSONS.clone();
    }
 
}

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

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

?
1
2
3
4
5
6
7
8
9
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正確使用訪問修飾符的文章就介紹到這了,更多相關(guān)Java使用訪問修飾符內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/7025763885546209294

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 婷婷久久久 | 国产精品2区| 久久九九99 | 亚洲欧美日韩在线 | 国产精品久久久久久久久久久久| 国产精品一区二 | 99在线免费视频 | 国产一区二区三区四区二区 | 色综合天天综合网国产成人网 | 日韩久色 | 国产一区二区在线播放 | 九九九亚洲 | 校园春色av| 国产婷婷精品av在线 | 免费毛片a线观看 | 国产欧美精品区一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 国产久| 国产精品亚洲综合 | 高清一区二区三区 | 亚洲一区二区 | 国产目拍亚洲精品99久久精品 | 中文字幕亚洲一区二区三区 | 精品一区在线视频 | 成人午夜精品久久久久久久3d | 欧美日韩免费一区二区三区 | 不卡免费在线视频 | 国产艹 | 久久大伊人 | 欧美国产精品一区 | 国内自拍视频在线观看 | 久久精品久久综合 | 久久久久久久久久久久网站 | 日韩精品免费一区二区夜夜嗨 | 欧美午夜一区 | 日韩精品一区二区三区在线 | 成人免费视频网站在线观看 | 国内精品三级 | 亚洲精品在线播放 | 亚洲美女一区 | 日韩国伦理久久一区 |