簡體   English   中英

Java OOP Public vs Private vs Protected

[英]Java OOP Public vs Private vs Protected

我了解公共,私人和受保護的行為。 我知道您應該使用它們來遵循面向對象編程的概念,並且我知道如何在使用多個類的程序中實現它們。

我的問題是:為什么我們這樣做? 為什么我不能直接修改另一個類的全局變量? 即使你不應該為什么保護,私人和公共修飾符甚至是必要的? 這就好像程序員不相信自己不這樣做,即使他們是編寫程序的人。

提前致謝。

你是對的,這是因為我們不能相信自己。 可變狀態是計算機程序復雜性的一個主要因素,它很容易構建起初看起來不錯的東西,隨后隨着系統變大而變得失控。 限制訪問有助於減少對象狀態以不可預測的方式發生變化的機會。 這個想法是讓對象通過明確定義的渠道相互通信,而不是直接調整彼此的數據。 通過這種方式,我們有一些希望測試單個對象,並對它們如何作為更大系統的一部分表現出一些信心。

讓我舉一個基本的例子(這只是為了說明):

class Foo {
  void processBar() {
    Bar bar = new Bar();
    bar.value = 10;
    bar.process();
  }
}

class Bar {
  public int value;
  public void process() {
    // Say some code 
    int compute = 10/value;
    // Her you have to write some code to handle
    // exception
  }
}

每件事看起來都很好,你很開心。 現在稍后您意識到其他開發人員或您用於設置值的其他api設置為0 ,這會導致Bar.process()函數中出現異常。

現在根據上面的實現,你無法限制用戶將其設置為0.現在看下面的實現。

class Foo {
  void processBar() {
    Bar bar = new Bar();
    bar.setValue(0);
    bar.process();
  }
}

class Bar {
  public int value;
  public void setValue(int value) {
    if(value == 0)
      throw new IllegalArgumentException("value = 0 is not allowed");

    this.value = value; 
  }
  public void process() {
    // Say some code
    int compute = 10/value;
    // No need to write exception handling code
    // so in theory can give u better performance too

  }
}

您現在不僅可以進行檢查,還可以提供信息性異常,這有助於在早期階段快速發現錯誤。

這只是其中一個例子,OOP(封裝,抽象等)的基礎知識,幫助您標准化界面並隱藏底層實現。

請記住,編寫給定類的開發人員可能不是唯一使用它的人。 開發人員團隊編寫軟件庫,這些庫在Java中通常作為JAR分發,由完全不同的開發團隊使用。 如果沒有這些標准,其他人很難知道任何可用變量/方法的意圖。

例如,如果我有一個私有/受保護的實例變量,我可能有一個公共“setter”方法來檢查有效性,前置條件並執行其他活動 - 如果任何人可以直接修改實例變量,那么所有這些都將被繞過。

另一個好處是Java文檔/教程: http//docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

公共字段傾向於將您鏈接到特定實現,並限制您更改代碼的靈活性。

  • 非本地行為很難推理。
  • 最小化表面積可以增加理解力。
  • 我不相信自己會記住所有的行為副作用。
  • 我絕對不相信“你”了解所有的行為副作用。
  • 我越少暴露我必須修改和擴展的靈活性。

我的問題是:為什么我們這樣做?

基本上,因為通過以這種方式限制自己,我們使...更容易...為我們自己,以及將來可能需要閱讀/修改代碼的其他人...理解代碼,以及各個部分交互的方式。

大多數開發人員通過抽象的心理過程來理解代碼; 即在思想上圍繞代碼位繪制邊界,孤立地理解每個位,然后理解每個位如何與其他位交互。 如果代碼的任何部分可能會混淆代碼的任何其他部分的“內部”,那么這使得典型的開發人員很難理解正在發生的事情。

在編寫代碼時,這對您來說可能不是問題,因為您可以在創建代碼時保持頭腦中所有復雜的交互。 但是在一兩年的時間里,你會忘記很多細節。 其他人從來沒有從頭開始的細節。

為什么我不能直接修改另一個類的全局變量?

因為它使你的代碼更難理解; 往上看。 代碼庫越大,問題就越明顯。

另一點是,如果您使用過度使用全局變量(實際上是靜態),那么如果您的代碼需要多線程/可重入,單元測試以及您需要在其他上下文中重用代碼,則會產生問題。

即使你不應該為什么保護,私人和公共修飾符甚至是必要的? 這就好像程序員不相信自己不這樣做,即使他們是編寫程序的人。

這不是信任。 它是關於在源代碼中表達邊界的。

如果我編寫一個類並聲明一個方法或字段private ,我知道我不必考慮如果其他類調用它/訪問它/修改它會發生什么的問題。 如果我正在閱讀別人的代碼,我知道我可以(最初)在映射交互和邊界時忽略private部分。 privateprotected修飾符和包私有只提供不同的邊界粒度。

(或者也許是關於信任;即不相信自己記住我們設計中的抽象邊界在哪里。)

基本上有兩個原因:

1)Java中存在需要安全性的接口。 例如,在您的盒子上運行Java小程序時,您希望確保小程序無法訪問未經授權的文件系統的某些部分。 如果沒有強制安全性,applet可以進入Java安全層並修改自己的權限。

2)即使每個人都“受信任”,有時權宜之計也勝過常識,程序員繞過API來訪問內部接口而不是增強API(事實上,這通常需要更長的時間)。 這會產生穩定性和升級兼容性方面的問題。

(在古代計算歷史的深處,存在一個由應用程序員以這種方式處理的操作系統,在某種程度上維護操作系統的程序員必須確保某些代碼段(不是入口點,但是實際的內部代碼序列)在修改操作系統時沒有改變物理地址。)

請注意,在OOP范例變得普遍之前存在這些問題,並且是OOP的一些動機。 OOP不是一種憑空發明的任意宗教教義,而是一系列已經過大約6年編程經驗的原則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM