2011-06-04 87 views
1
class Foo { 
    String bar; 
    // private String bar; 
} 

public class A { 
    public void method1() { 
     Foo foo = new Foo(); 
     // foo.bar; or foo.getBar(); which is preferable 

    } 
} 

是否有意義聲明變量爲私有與類成員定義getter/setter方法(例如應bar被聲明爲private在Foo或是否應該只是聲明爲String bar)?我寧願刪除它們,意識到無論如何都不能在這門課之外訪問它們。什麼是更可取的?將公共類中聲明的類成員定義的getters/setters聲明爲private是否有意義?

+2

你的問題不清楚。無論如何,Foo現在不是內心階層。請給出一個簡短但完整的例子,包括您想要刪除的獲得者/設置者。 – 2011-06-04 05:39:52

+0

@Jon - 將刪除內部類標記,這是針對在類「A」中聲明的類 – Joe 2011-06-04 05:42:39

+0

@Joe:更改示例會比更改標記更好...您的問題仍不清楚。 – 2011-06-04 05:44:31

回答

1

使用獲取器和設置訪問/變異私人字段成員是標準的OO練習。它允許在保持公共接口的同時改變類的內部工作。

如果您通過使其作爲公共接口的一部分直接可用(通過公開)訪問/更改bar,現在看起來似乎很好,但是幾個月後,您決定要添加一些驗證到bar?也許你不希望bar永遠被設置爲null。你怎麼能做到這一點?如果您使用getter和setter,則只需要嘗試將bar設置爲null,您就需要更改設置器以引發異常。如果您直接改變bar,則不能這樣做。更徹底地,你可能會決定不再需要bar

獲取者和設置者並不意味着該類內部存在相同名稱和類型的字段成員。他們只告訴你,這個類有一個可以被訪問/變異的屬性,並且不會指示類在內部執行的方式。這給你一個很大的靈活性。

1

如果只是數據訪問,沒有getter/setter應該沒問題(一些純粹主義者可能不同意)。而且你的班級應該可以訪問內部班級的私人成員,這樣你就可以保持私密。

0

請先回答:爲什麼method1需要知道foobar?爲什麼method1需要知道Foo s甚至bar s在第一位?

+0

爲什麼不知道foo的酒吧?我有一些需要在Foo中使用bar成員變量的功能。我不知道爲什麼這裏有關。我需要澄清我是否應該使用getter訪問bar,還是應該避免getter並通過foo.bar訪問它? – Joe 2011-06-04 06:58:03

+0

因爲不瞭解對象的成員是OOP中的默認**。這是相關的,因爲你顯然正在嘗試編寫OO代碼,並且有一些方法可以做到這些。在Foo中需要使用bar成員變量的功能「通常是**應該由Foo本身**提供的功能。 – 2011-06-06 22:39:37

1

讓富的內部類並沒有getter/setter方法:

public class A { 
    private class Foo { 
     String bar; 
    } 

    public void method1() { 
     Foo foo = new Foo(); 
     foo.bar = "x"; 
    } 
} 

這是OK的設計,因爲foo是唯一可見內的 - 它沒有比在一個類中直接訪問私有字段更糟而不是通過吸氣劑。