Java訪問許可權控制的使用不當,活生生地引發了一場血淋漓的慘案

来源:https://www.cnblogs.com/qing-gee/archive/2018/11/30/10042173.html
-Advertisement-
Play Games

人在什麼面前最容易失去抵抗力? 美色,算是一個,比如說西施的貢獻薄就是忍辱負重、以身報國、助越滅吳;金錢,算是另外一個,我們古人常說“錢乃身外之物,生不帶來死不帶去”,但我們又都知道“有錢能使鬼推磨”。 除去美色和金錢,我認為還有一個,就是讀者的認可——“二哥,你的文章真的很棒,我特別喜歡。希望能多 ...


人在什麼面前最容易失去抵抗力?

美色,算是一個,比如說西施的貢獻薄就是忍辱負重、以身報國、助越滅吳;金錢,算是另外一個,我們古人常說“錢乃身外之物,生不帶來死不帶去”,但我們又都知道“有錢能使鬼推磨”。

除去美色和金錢,我認為還有一個,就是讀者的認可——“二哥,你的文章真的很棒,我特別喜歡。希望能多多更新Java基礎知識,真的是受益良多,就好像是在讀王小波的散文,但又學了編程!”——你說,收到讀者這樣暖暖的評語,還需要美色和金錢?“兩者皆可拋”嘛。

這篇文章主要介紹一下Java的訪問許可權控制。

01 訪問許可權控制的重要性

舒淇曾說過這樣一句令人感到震撼後又虎軀一震的話:“我要把我曾經脫下的衣服一件一件的穿回來!”如今,她做到了——通過自己的努力,不僅得到了觀眾的認可,得了很多大獎,還收穫了幸福。儘管,真的是儘管,還有一些“憶往昔崢嶸歲月稠”的朋友在電腦硬碟的深處留存了一些舒淇早年的珍藏版照片。

我扯這個例子主要為了證明一句話——訪問控制(或隱藏具體實現)與“最初的實現並不恰當”有關——如果舒淇當初那些照片的許可權不是那麼公開化的話,那現在就可以私自燒毀了;或者換一種出道方式;然而沒有如果了。

在你最初的編程生涯中,不知道你是否創作過下麵這樣“優秀”的代碼,就像程式清單1-1那樣。

程式清單1-1:

public class NiubiUtil {
    public static Date getNextDay() {
        long millis = 24 * 60 * 60 * 1000;
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new Date(System.currentTimeMillis());
    }
}

本來你這些代碼只是自己寫著玩呢,誰知道被一個叫小二哥的同事不經考量地調用了。這一調用不要緊,小二哥的代碼真的活活地等了一整天——產品經理小王老師某一天心血來潮非要測試小二哥的代碼,然後點了查看下一天的按鈕,程式真的在那靜靜地等著,直到下一天真的來臨。

後果是,小王老師為了安撫用戶們躁動的情緒把小二哥直接拉出去祭天了;你躲在角落裡瑟瑟發抖,心裡默默念叨了句話——“小二哥,你走好,兄弟真的對不住了”。

一場血淋漓的慘案啊!只因為Java訪問許可權控制的使用不當——該private的方法,結果失誤寫成了public——論訪問許可權控制的重要性。

02 為什麼需要訪問許可權控制

我已經在Java編程的道路上混跡了多年,自然也寫過無數曾經看起來那麼“優秀”的代碼。隨著時間的推移,再迴首過往的那些代碼時,總有一種“這真的出自我手?”的疑問。

這種疑問包含兩層意思,一層是感慨真的寫得好,就好像年老時的李白看見自己年少時寫的《望廬山瀑布》:“日照香爐生紫煙,遙看瀑布掛前川;疑是銀河落九天,飛流直下三千尺。”——喲,老子年輕時寫得也不賴啊。

另外一層是感慨真的寫得差,比如說程式清單1-1,往事不堪迴首啊,只能都隨風,都隨風,都隨風而去!

對於這些寫得很差的代碼,我每次看見都想再修改一次,期待她更可讀、更易理解、更具可維護性;但在美好的願景下,也存在著巨大的壓力,因為有好多其他的地方引用了要修改的代碼,牽一發而動全身啊。

在變與不變的過程中,我發現——訪問許可權控制真的太重要了。在寫代碼的過程中,我們需要儘量遵循這樣一個原則——除了那些必須public的方法,儘量把其他方法定義為private。這樣做的好處是,在重構private方法的時候不必再擔驚受怕,因為它們不會被類外部訪問到。

03 protected許可權修飾符是用來幹嘛的

我們知道,public許可權修飾符使類的一切方法和屬性對外可見;private許可權修飾符使類的一切方法和屬性只對內部可見;那麼protected許可權修飾符呢?

假如有一個叫王二的家伙,他有三個屬性,分別是私生活、外在形象和被保護的財產,就像程式清單3-1那樣。

程式清單3-1:

public class Wanger {

    // 私生活
    private String life;

    // 外在形象
    public String image;

    // 被保護的財產
    protected String money;
}

王二生了一個孩子叫王小二,就像程式清單3-2那樣。

程式清單3-2:

public class Wangxiaoer extends Wanger{
    @Override
    public String toString() {
        return "可以繼承的財產:" + money + ";塑造的人設:" + image + ";得不到的私生活:";
    }
}

王小二可以繼承到王二的財產money(據說王二在王小二出生的第一個月為其存了100,以後每個月的利率為12%,現在存款是3758.17,你知道王小二現在多大了嗎?),也可以模仿一點父親的外在形象image,但卻不能按照父親的私生活方式生活。

註意到三個許可權修飾符的區別了嗎?

protected可以保護王二的財產順利地繼承到王小二那裡,外界的人是訪問不到的;public不安全,因為不僅王小二可以繼承訪問,外界其他人也可以訪問;private太私有化,不僅外界訪問不到,王小二也繼承不到。

04 總結

訪問許可權控制的兩個重要作用:第一是為了防止外界觸碰到不該觸碰的地方(private修飾的成員變數或者方法);第二是讓類的設計者可以更改內部(private修飾的成員變數或者方法)的工作方式,而不必擔心有沒有對外界造成干擾。


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • inputNumber算是一個比較簡單的組件了。 解析: (1)先看下html結構 左邊的減號和右邊的加號是通過絕對定位,設置在input左右的padding位置的,input的css代碼如下: 這個inputNumber源碼還算簡單,多看幾遍就懂了 ...
  • The web is constantly evolving. The technology was conceived and implemented based on the needs, current at the time of creation. The business require... ...
  • url的正則表達式:包括IP,功能變數名稱(domain),ftp,二級功能變數名稱,功能變數名稱中的文件,功能變數名稱加上埠!用戶名等等信息 匹配手機號 用戶名正則,4到16位(字母,數字,下劃線,減號) 密碼強度正則 整數正則 數字正則 Email正則 身份證號正則 URL正則 IPv4地址正則 十六進位顏色正則 日期正則 ...
  • 一、事件流(捕獲,冒泡) 事件流:指從頁面中接收事件的順序,有冒泡流和捕獲流。 當頁面中發生某種事件(比如滑鼠點擊,滑鼠滑過等)時,毫無疑問子元素和父元素都會接收到該事件,可具體順序是怎樣的呢?冒泡和捕獲則描述了兩種不同的順序。 DOM2級事件規定事件流包括三個階段,如圖: 假如我們點擊一個div, ...
  • 一定的需求情況下,無法使用小程式原生的 tabbar 的時候,需要自行實現一個和 tabbar 功能一模一樣的自製組件。 查閱了海量的博客和文檔之後,親自踩坑。總結了三種在不使用微信小程式原生 tabbar的情況下自製 tabbar 的方法。並說說這幾種方法各自的特色。 類 navigator 跳轉 ...
  • 小程式冒泡事件與非冒泡事件 會隨之觸發父元素的稱為冒泡事件,反之,則是非冒泡事件 wxml: wxss: js(在page里添加): 頁面效果: 點擊view1: 點擊view2,也會觸發父元素 點擊view3,會觸發view2,然後再觸發view3 ...
  • 博客: "blog.shinelee.me" | "博客園" | "CSDN" [TOC] 面向過程與面向對象的思考方式 面向過程 和 面向對象 的差異主要體現在 思考方式 上,面對同樣一個任務, 面向過程的思考方式 ,首先想的是 一步步該怎麼做 , 對任務進行分解,先乾什麼後乾什麼,劃分成不同階段 ...
  • 棧長得到消息,Hystrix 停止開發了。。。 大家如果有對 Hystrix 不清楚的,請看下這篇文章: "分散式服務防雪崩熔斷器,Hystrix理論+實戰" 。 來看下 Hystrix 停止開發官宣: https://github.com/Netflix/Hystrix 文中大概的意思是: Hys ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...