2011-08-22 99 views

回答

0

你可以做到,但幾乎沒有一點。如果這些方法是私有的,那麼任何可以調用這些方法的代碼都可以直接訪問對象屬性。

+0

我認爲任何可以調用這些方法的代碼都在我的控制之下。我選擇如何訪問對象屬性,我可以選擇編寫一個setter/getter便捷方法來節省自己一遍又一遍重複相同代碼的麻煩。 – emory

+0

我創建了一個計數器示例 - http://stackoverflow.com/questions/7143564/can-create-the-getter-and-setter-method-private/7144089#7144089 - 其中一些代碼可以訪問setter/getter方法不能直接訪問對象屬性。無可否認,它似乎仍然毫無意義。 – emory

1

一般使制定機構私有方法是使immutable objects.

+1

爲什麼甚至要創建一個setter,然後當任何可以調用setter的代碼都可以直接修改私有變量,並覆蓋setter可能做出的任何類型的檢查。 – Paulpro

+0

你可能會放棄setters/getters可能做的檢查,直接修改狀態變量。私人二傳手/吸氣人員只爲這些附加檢查提供周到的解決方案。 – panzerschreck

+0

如果我想讓一個對象不可變,我會(除其他外)使其屬性成爲最終的。然後它不能有一個setter方法。 – emory

0

是,getter和setter可以由私人的衆多方式之一。如果你想創建一個JavaBean,然後私人的getter/setter失敗JavaBeans的標準,其中規定:

類的屬性必須使用得到是可訪問的,設置(用來對於 布爾屬性而不是得到)和其他方法(所謂的 訪問器方法和增變器方法),遵循標準 命名約定。這允許在框架內輕鬆自動檢查和更新bean狀態,其中許多包括針對各種類型的屬性的定製編輯器 。

0

沒有理由不讓吸氣器和吸氣器保持私密。

你爲什麼要這樣做?如果setter方法間接修改了一個屬性。例如,如果您的circle類具有radius屬性,那麼您可以設置setRadius,setDiameter,setCircumference,setArea方法,並且可以選擇使這些方法保密。實際上,如果插入一些令人費解的代碼,則可以調用這些setter/getter方法的代碼,這些方法不能直接修改屬性(不使用反射)。但它充分令人費解,似乎不值得麻煩。

/** 
* This convoluted class will not work correctly unless the line "this . xRef . set (x)" is line 10 and the line "x = this . xRef . get () ;" is line 23 
**/ 
class Private 
{ 
    private void setX (int x) 
    { 
    try 
     { 
     this . xRef . set (x) ; 
     } 
    catch (IllegalAccessException cause) 
     { 
     assert false ; 
     } 
    } 

    private int getX () 
    { 
    int x ; 
    try 
     { 
     x = this . xRef . get () ; 
     } 
    catch (IllegalAccessException cause) 
     { 
     x = 0 ; 
     assert false ; 
     } 
    return x ; 
    } 

    private final Reference <Integer> xRef = new Reference <Integer> () 
    { 
     @ Override 
     public Integer get () throws IllegalAccessException 
     { 
     checkMethod ("Private" , "getX" , 23) ; 
     return super . get () ; 
     } 

     @ Override 
     public void set (Integer val) throws IllegalAccessException 
     { 
     checkMethod ("Private" , "setX" , 10) ; 
     super . set (val) ; 
     } 
    } ; 

    public static void main (String [ ] args) 
    { 
    Private p = new Private () ; 
    p . setX (5) ; 
    System . out . println (p . getX ()) ; 
    try 
     { 
     p . xRef . set (100) ; 
     } 
    catch (IllegalAccessException cause) 
     { 
     cause . printStackTrace () ; 
     } 
    System . out . println (p . getX ()) ; 
    } 
} 

class Reference <T> 
{ 
    private T val ; 

    public void set (T val) throws IllegalAccessException 
    { 
    this . val = val ; 
    } 

    public T get () throws IllegalAccessException 
    { 
    return this . val ; 
    } 

    public void checkMethod (String className , String methodName , int lineNumber) throws IllegalAccessException 
    { 
    IllegalAccessException cause = new IllegalAccessException () ; 
    boolean delta = true ; 
    for (StackTraceElement e : cause . getStackTrace ()) 
     { 
     if ((e . getClassName () . equals (className)) && (e . getMethodName () . equals (methodName)) && (e . getLineNumber () == lineNumber)) 
      { 
      delta = false ; 
      break ; 
      } 
     } 
    if (delta) 
     { 
     throw cause ; 
     } 
    } 
} 
1

可以建立私人的setter和getter方法?如果是或否,爲什麼?

1)是的你可以做到這一點。

2)原因是你可以這樣做是因爲Java語言規範說你可以。就JLS而言,getter和setter方法以及其他方法在語言上並無不同。和任何方法可以被宣佈爲私人。

你未說明的問題,就是爲什麼你會它。原因很簡單:隱藏在課堂外使用的方法。你爲什麼要這樣做?這是一個典型的用例:

我們希望將一些邏輯(在這種情況下約束強制)與屬性的設置(或獲取)相結合,但我們不希望setter(或getter)是可見的:

public class Foo { 
    private Foo parent; // this must not change once it has been set 
    .... 
    private void setParent(Foo parent) { 
     if (this.parent != null) { 
      throw new SomeException(...); 
     } 
     this.parent; 
    } 
}