Java Access Modifier最佳实践

时间:2015-01-20 15:28:38

标签: java variables methods access-modifiers

这似乎是一个基本问题,但我希望能做到这一点。

我有一个'世界级'。在该类中,我有一个绘制边框的方法,具体取决于用户设置的地图大小。

如果变量'mapSize'是私有的,但我想从同一个类中访问它的值,是否更适合直接引用它,或者使用getter方法。

下面的代码应该解释我想知道的内容。

package javaFX;

public class AWorld {
    //initialized later
    AWorld newWorld;

    private int mapSize = 20;

    public int getMapSize()
    {
        return mapSize;
    }

    public void someMethod()
    {
        int var = newWorld.mapSize; //Do I reference 'mapSize' using this...
    }
    // Or...

    public void someOtherMethod()
    {
        int var = newWorld.getMapSize(); //Or this?
    }
    public static void main(String[] args) {}

}

3 个答案:

答案 0 :(得分:2)

由于您获得了原始字段,因此其中任何一个都可以。如果get方法在返回数据之前执行另一操作,例如对值执行数学运算,那么最好使用它而不是直接调用该字段。这在您的类上使用代理/装饰器模式时特别适用。

这是上面第二个陈述的一个例子:

//base class to be decorated
abstract class Foo {
    private int x;
    protected Foo foo;
    public int getX() { return this.x; }
    public void setX(int x) { this.x = x; }
    public Foo getFoo() { return this.foo; }

    //method to prove the difference between using getter and simple value
    public final void printInternalX() {
        if (foo != null) {
            System.out.println(foo.x);
            System.out.println(foo.getX());
        }
    }
}

//specific class implementation to be decorated
class Bar extends Foo {
    @Override
    public int getX() {
        return super.getX() * 10;
    }
}

//decorator
class Baz extends Foo {
    public Baz(Foo foo) {
        this.foo = foo;
    }
}

public class Main {
    public static void main(String[] args) {
        Foo foo1 = new Bar();
        foo1.setX(10);
        Foo foo2 = new Bar(foo1);
        //here you see the difference
        foo2.printInternalX();
    }
}

输出:

10
100

答案 1 :(得分:0)

你最好直接取消引用它。

private修饰符的要点是不将内部实现暴露给其他类。这些其他类将使用getter方法获取私有属性的值。

在你自己的课堂上,使用getter是没有意义的。更糟糕的是,有人可能会在扩展您的类的类中覆盖该方法,并且getter可能会执行您不期望的内容

答案 2 :(得分:0)

恕我直言,如果您要引用当前实例的字段,则一般规则是直接使用mapSizethis.mapSize访问该字段。

如果要引用来自不同实例的值(无论是同一个类还是不同的类,我都会使用getter方法)。我相信这会导致更简单的重构。它还维护任何其他实例通过getter获取字段值的合同,这允许getter中的其他功能。