可以创建私有的getter和setter方法吗?

时间:2011-08-22 05:39:41

标签: java

可以创建setter和getter方法私有吗?如果是或否,为什么?

5 个答案:

答案 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 ;
        }
    }
}