2013-02-15 132 views
1

以下是我作爲課堂練習所做的Java代碼。我有一個名爲SavingsAccount的類。它有平衡和利益變量。但是,我將它們設置爲公開,但是如果我想單獨處理這些帳戶,是否需要將它們設置爲私有,併爲這些變量設置「獲取/設置」方法?我能否公開讓變量公開?其餘的代碼都有使用這些變量進行計算的方法。Public vs Private

public class SavingsAccount { //This class has three different variables that define it 
    public double balance; //Double for account balance 
    public static double annualInterestRate; //Class method for interest rate 
    public final int ACCOUNT_NUMBER; //Constant int for keeping track of accounts 


public SavingsAccount (int ACCOUNT_NUMBER, double balance) { //Constructor that takes down account number and balance to keep track of 
     this.ACCOUNT_NUMBER = ACCOUNT_NUMBER; 
     this.balance = balance; 
    } 
+1

「單獨處理帳戶」與帳戶數據的訪問方式無關。 – 2013-02-15 14:37:14

+0

我可以問爲什麼這是低票?我想了解更多關於封裝。 – SndLt 2013-02-15 14:39:42

+0

我舉了一個示例代碼驗證示例。這篇文章沒有一個例子。但是沒問題。 – SndLt 2013-02-15 14:41:43

回答

1

然而,我將它們設置爲公開,但如果我想治療的賬戶 獨立,做我需要讓他們私享「的get/set」 方法爲這些變量?

首先,您的類的每個實例被視爲一個單獨的SavingAccount。

SavingAccount acct1 = new SavingAccount(....); //represents one Saveing account 
SavingAccount acct2 = new SavingAccount(....); //represents another Saveing account 

如果您的屬性被標記爲公開或私人,這並不重要。通常如果你想封裝你的類,你的屬性是私有的,並且有公共的getter/setter方法,這樣其他對象不能直接訪問你的屬性。他們只能通過getter/setter訪問它們。

0

它是一個好主意,使私營領域爲數據封裝。數據封裝是限制和控制對字段的訪問以防止程序員採取不必要的行爲的做法。如果你不這樣做,程序員可能以不受控制的方式訪問或更改實例上的變量,這可能會破壞事物。換句話說,控制對變量的訪問會使事情難以分解並引入錯誤。

基本上,你的課程應該像一個「黑匣子」。從外部看,另一個程序員看不到,也不關心內部(即私人領域)是如何工作的。您只能使用顯式聲明的操作(即公共方法)與框進行交互。這些操作將根據需要操縱內部。

當然,你可以做任何你想做的事情。

0

如果你定義變量public,它們可以直接訪問/設置。
如果你將它們定義爲私有的,你需要getters和setter。

控制訪問是可取的,聲明它們是私人的。

6

你當然可以變量作爲公共但也有很多人在這裏誰也追捕你爲...
這是encapsulation於二OO範式的問題。一般來說,物體不應該捅到彼此的內部。

+2

使會員儘可能私密,並根據需要公開。 – 2013-02-15 14:38:33

+0

+1,這是你的世紀.. :) – PermGenError 2013-02-15 15:37:34

0

它很好,它使私人。假設我正在訪問您的課程並設置如下的值。

SavingsAccount sa = new SavingsAccount(12345,25000);

我現在可以使用該對象直接設置了平衡,如下所示:

sa.balance = -300;

sa。ACCOUNT_NUMBER = 6789;

班上沒有提供任何安全保障。這是OOP中稱爲數據封裝的重要概念。

0

除非您在設置值(即餘額不爲負數)時執行某種驗證,否則請儘可能使用public

爲僅僅返回或分配一個值的屬性創建getter和setter,而沒有額外的邏輯,實際上將您的屬性公開爲public,併爲代碼提供了不必要的混亂(就可讀性而言)。直接使用公共屬性會使代碼更清晰。

例1:

*您希望允許一個賬戶只能有積極的平衡。您必須執行檢查,以確定每次爲其分配值時是否爲其分配負值。

要做到這一點的最好的地方是在一個setter方法。這讓你擺脫了不得不在整個地方投入大量if(newBalance < 0)支票的麻煩。

要強制實現僅需要正餘額值的事實,請將屬性設置爲private。這限制了可能想要爲balance屬性(*)分配負值的程序員。爲了使餘額屬性中的值再次可訪問,您需要爲私有值添加一個getter。

您現在擁有一個public屬性的「某種」,您在其上強制執行限制(不能設置爲負值)。

例2:

你要採取每個帳戶的筆記。您的班級中將有String notes;屬性。

如果沒有要強制執行的限制,最好在此使用public修飾符。

考慮以下哪些代碼塊是清潔:

accountA.setNotes(accountB.getNotes()); 

accountA.notes = accountB.notes; 

他們都從一個帳戶複製notes給對方,但後者更容易閱讀。

+0

你的領域不應該公開,除非絕對必要 – 2013-02-15 14:46:17

+0

同意 - 這違背了面向對象的概念。 – 2013-02-15 14:47:13

+1

-1 - 使用訪問器和增變器的想法是讓你稍後改變實現,而不需要更新一堆其他代碼。例如,我可以改變一個簡單的setter來包含驗證。或者我可以改變一個吸氣劑不再返回私人領域,而是執行計算。我會說「混亂」是值得的,特別是因爲大多數IDE會爲你生成這個代碼。 – 2013-02-15 14:48:13

0

總是建議設置一些字段private而不是public
因爲使用適當的方法來訪問它們提供了整潔的代碼和更少的錯誤。
想想你自己,有人想知道你的帳號,以現金的方式給你一個禮物。
你會更喜歡哪一個人要求你及時獲得你的A/C。否或您公開宣佈您的賬戶號碼,並且該人在未通知您的情況下獲得賬號。
第一個似乎使它private和使用get/set方法。
第二個似乎使它public

0

我認爲有可能指出兩個不同的情況,你想要什麼,你不想使用公共領域。

第一個是你使用不可變數據結構的時候。我完全相信,不變的數據結構是你想要努力的。不可變結構的優點和缺點可以在別處找到;關於公共領域,不可變結構提出了顯而易見的問題 - 公開所有領域。那麼,結構是不可變的,所以你只能讀取值。在這種情況下,getter是完全不必要的,只會讓代碼混亂。

而第二個顯然是當你使用可變結構。在這種情況下,使用getter和setter是合理的;你完全有可能將一些邏輯放在setter中,並且在這裏封裝數據字段是必須的:你真的不希望有人不小心改變你的數據。不過,我認爲可變DTOs是邪惡的,應該避免;我看到他們使用的唯一原因是與Hibernate等一些API兼容。

你也應該隱藏字段,當他們包含你不想讓任何人訪問的內部狀態。類實現一些行爲(服務,DAO等)就是這種情況。在這種情況下,你通常不希望創建getter和setter。簡而言之,我會給出以下建議:使用帶有公有字段的不可變對象作爲DTO,並使這些DTO上的行爲類儘可能地關閉。

相關問題