可以创建setter和getter方法私有吗?如果是或否,为什么?
答案 0 :(得分:1)
通常将setter作为私有方法是制作immutable objects.
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
你可以做到,但几乎没有意义。如果这些方法是私有的,那么任何可以调用这些方法的代码也可以直接访问对象属性。
答案 3 :(得分:0)
是的,可以将吸气剂和制定者设为私人。如果要创建JavaBean,则私有getter / setter会使JavaBeans标准失败,该标准指出:
可以使用 get , set , 来访问类属性 (用于 布尔属性而不是 get )和其他方法(所谓的 访问方法和mutator方法),遵循标准 命名-约定。这样可以轻松实现自动检查和更新 框架中的bean状态,其中许多包括自定义编辑器 适用于各种类型的房产。
答案 4 :(得分:0)
没有理由不能将getter和setter私有化。
你为什么要这样做?如果setter方法间接修改了属性。例如,如果您的圆类具有半径属性,那么您可以使用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 ;
}
}
}