簡體   English   中英

Java setter和getter?

[英]Java setter and getter?

每個人都知道Java支持數據隱藏。

我去面試了。 然后面試官問我Java是否支持通過使用private作為數據類型來隱藏數據。

他說,如果我們在該類中使用setter和getter,那么通過使用這些setter和getter,我們可以輕松獲取私有數據。

那么這如何支持隱藏在這里的數據?

他可能在試圖讓我陷入困境。 但是我無法回答。

我對此應該回答什么?

他在爭辯說,如果“數據隱藏”是OOP原則,那么我們不是通過通過getter和setter進行公開來破壞它。 我認為他希望您闡明在原理上能夠直接訪問數據成員與通過getter或setter方法進行訪問之間的區別。 在前一種情況下,班級的客戶可能會處理錯誤的數據,為其分配一個班級設計者尚未設計要處理的班級的值(例如,將學生的年齡設置為500歲)。 在后者中(使用設置器),類設計器對可以為數據分配哪些值施加了一定的限制。 在年齡示例中,二傳手可能類似於:

void setAge(int age) {
if(age<3 || age>100) 
  return;
this.age=age;
}

假設不允許3歲以下且100歲以上的學生。 因此,您仍在隱藏數據,但允許以與模塊邏輯一致的方式操縱數據。

很簡單的例子:

該類的版本1可能會有這樣的getter。

public int getTotal() {
   return total_;
}

版本2可以做到這一點

public int getTotal() {
  return a + b;
}

我們已經更改了類的實現方式,但是該類的客戶端也不需要更改,因為數據隱藏在吸氣劑的后面。

數據隱藏是個壞詞,最好是數據封裝。 在Java中,通過訪問器和更改器(getter和setter)完成對私有成員的訪問,這全都在於隱藏和控制對成員的訪問,以便您可以控制實例內部狀態的修改方式。

我認為如果您提到有關Java反射/元數據的內容->您將獲得加分

如果我們將class字段聲明為private ,則它們是隱藏的。 毫無疑問(我們忽略了討厭的反射技巧)。 如果要使這些可訪問,則可以提供訪問方法(例如,getter / setter)。

但是不需要為所有字段提供getter和setter或根據字段(通常)來命名它們。

類內部(字段)完全隱藏。

protected String name;

public void setName(String newName){
    if(newName.length() > 5) this.name = newName
}

public String getName(){
    return this.name;
}

在這種簡單情況下,可以通過其名稱在此類及其所有子級中訪問name屬性。 如果要從不相關的類中設置name的值,則必須使用setName()方法,例如,可以在其中應用一些驗證。

在這里,您可以找到有關此特殊方法所需的任何信息。

請注意,如果更改器和訪問器是public則可以訪問類的任何屬性。 這是Java Bean概念的關鍵點之一,幾乎所有的Java框架都在某一點或另一點與此概念相關。

可以通過以下事實來解釋對“數據隱藏”的支持:getter和setter方法就像通往數據的網關。

只有按照約定 (准確地說是JavaBeans約定) ,它們才可以在以其命名的成員上進行操作。 他們可以做其他任何事情,並且仍然是完全可編譯且合法的Java。

您正在談論的似乎是封裝 基本上,getter和setter允許您根據需要公開類變量並隱藏其他變量。 Getter和Setters還允許您執行任何其他必要的步驟,例如驗證。

Getter和Setter本身可以具有不同的訪問修飾符,因此可以通過使用不同的訪問修飾符將數據公開給某些類,而不能公開給其他類。

我敢打賭,他在等待您也將提及“不可變”類型。

PD。 private是沒有類型,它是訪問修飾符。

也許,他的意思是封裝作為信息隱藏。

如果將setter和getter設為公開/受保護/默認,則可以訪問不同級別的私有成員..如果將setter&getter設為私有,則數據實際上是隱藏的。 最后的路雖然沒有任何意義

您可能會考慮以許多不同的方式實現set / get方法。

正如一些答案已經指出的那樣,設置/獲取不必實際設置或返回實際成員。

例如,假設您有一個具有(x,y)的set / get的Coordinate類。 內部實現可能基於極坐標:

private double radius;
private double angle;

(x,y)的get / set與sin和cos進行一些坐標轉換。

您可以隨意將類的實現更改為任何其他坐標系,並且仍然僅將(x,y)的設置/獲取保留為公共方法。

因此,總而言之,我對這個問題的回答是:一個類的公共接口可以提供set / get,但是可以(並且應該)通過將所有成員設為私有(或受保護)來隱藏實際的實現。 因此,可以說,對私有數據進行公共設置/獲取是“實現隱藏”,而不是數據隱藏。

初學者可能經常將數據隱藏和封裝誤認為安全性。 重要的是要了解數據隱藏和封裝與安全性無關。

存在這些概念是為了確保從類B(類B擴展了類A)的類A的繼承不會繼承“封裝的”成員。

我希望這能澄清您的困惑,並激發您閱讀和學習的更多知識。 您的問題對於OOPS概念非常基礎。 面試官並不是想corner逼人,而是向您詢問有關OOPS的非常基本的問題。 努力學習!!!

暫無
暫無

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

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