可以創建setter和getter方法專用?如果是或否,爲什麼?可以創建私人的getter和setter方法嗎?
回答
你可以做到,但幾乎沒有一點。如果這些方法是私有的,那麼任何可以調用這些方法的代碼都可以直接訪問對象屬性。
一般使制定機構私有方法是使immutable objects.
爲什麼甚至要創建一個setter,然後當任何可以調用setter的代碼都可以直接修改私有變量,並覆蓋setter可能做出的任何類型的檢查。 – Paulpro
你可能會放棄setters/getters可能做的檢查,直接修改狀態變量。私人二傳手/吸氣人員只爲這些附加檢查提供周到的解決方案。 – panzerschreck
如果我想讓一個對象不可變,我會(除其他外)使其屬性成爲最終的。然後它不能有一個setter方法。 – emory
是,getter和setter可以由私人的衆多方式之一。如果你想創建一個JavaBean,然後私人的getter/setter失敗JavaBeans的標準,其中規定:
類的屬性必須使用得到是可訪問的,設置,是(用來對於 布爾屬性而不是得到)和其他方法(所謂的 訪問器方法和增變器方法),遵循標準 命名約定。這允許在框架內輕鬆自動檢查和更新bean狀態,其中許多包括針對各種類型的屬性的定製編輯器 。
沒有理由不讓吸氣器和吸氣器保持私密。
你爲什麼要這樣做?如果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 ;
}
}
}
可以建立私人的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;
}
}
- 1. 公共getter和setter方法私人
- 2. 我可以隱藏UML2視圖中的getter和setter方法嗎?
- 3. Getter和Setter方法
- 4. setter和getter方法
- 5. 如何創建getter和setter
- 6. NSMutableArray Setter和Getter方法
- 7. Gui getter和setter方法
- 8. 調用getter和setter方法
- 9. 設置getter和setter方法
- 10. Laravel 4:getter和setter方法
- 11. getter和setter方法在WCF
- 12. 我可以使用私人方法嗎?
- 13. 可以攔截私人方法嗎?
- 14. IntelliJ快捷方式爲getter和setter方法創建默認javadoc
- 15. 創建一個從屬性的getter和setter方法
- 16. PHP getter/setter方法
- 17. 嘲諷/磕碰類的私有變量,而getter和setter方法
- 18. Python的私人領域與getter方法
- 19. C#的getter setter方法以列表
- 20. C#BestPractice:私人var和公共的getter/setter或公共變種
- 21. 反射的setter,getter方法
- 22. 我可以在symfony實體中手動添加getter和setter方法嗎?
- 23. 修改變量的getter和setter方法
- 24. ES5 getter和setter方法是「潛在的令人驚訝和難以推理」
- 25. 如何在QT創建器中自動創建getter和setter方法
- 26. ASP.MVC中的Getter和Setter可以實例化一個對象嗎?
- 27. 我可以通過getter直接添加到私人列表嗎?
- 28. 如何爲多維數組創建一個getter方法和一個setter方法?
- 29. 沒有getter/setter方法
- 30. jsonencoderdecoder沒有getter/setter方法
你在問是否getter和setter可以變成私人的,或者你想知道把getter和setter作爲私有方法的優點和缺點嗎? – Swagatika
只問可以創建私人的getter和setter? – BoomirajP
是的,你可以。對此沒有限制。 – Swagatika