Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java访问修饰符最佳实践_Java_Variables_Methods_Access Modifiers - Fatal编程技术网

Java访问修饰符最佳实践

Java访问修饰符最佳实践,java,variables,methods,access-modifiers,Java,Variables,Methods,Access Modifiers,这似乎是一个基本的问题,但我想把它弄对 我有一门课叫“AWorld”。在该类中,我有一个根据用户设置的贴图大小绘制边框的方法 如果变量“mapSize”是私有的,但我想从同一个类中访问它的值,那么直接引用它还是使用getter方法更合适 下面的代码应该解释我想知道的 package javaFX; public class AWorld { //initialized later AWorld newWorld; private int mapSize = 20;

这似乎是一个基本的问题,但我想把它弄对

我有一门课叫“AWorld”。在该类中,我有一个根据用户设置的贴图大小绘制边框的方法

如果变量“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) {}

}

这两种方法都可以,因为您得到的是一个基本字段。如果
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

你最好直接去引用它

private修饰符的目的不是向其他类公开内部实现。这些其他类将使用getter方法获取私有属性的值


在您自己的类中,使用getter是没有意义的。更糟糕的是,在扩展您的类的类中,可能有人重写了该方法,getter可能会执行一些您不希望执行的操作,如果您正在引用当前实例的字段,一般规则是使用
mapSize
this.mapSize
直接访问该字段


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

我认为这里更大的问题是为什么类
AWorld
包含
AWorld
的实例?您已经创建了一个无限循环。每次你创建一个
AWorld
时,这个结构都会创建一个新的
AWorld
,直到你的内存用完为止。@JohnB问题中的文本对此进行了解释。看起来像包装纸。可能它应该被注入,而不是在内部创建。忽略newWorld实例,我把它作为示例代码放在一起问这个问题,因为我使用的类相当长。为了回答您的问题,一般做法是使用字段as
mapSize
this.mapSize
如果类if
final
。如果它不是最终的,并且有可能超载该值,您可能会考虑<代码> GETMAPMASIZEX/CODE >,但您增加了可能不需要的复杂性。@ JohnB,您搞错了。OP想知道如何在代码中使用
newWorld#mapSize
。你是说newWorld.mapSize==mapSize吗?@Yazan我不是这个意思。@luigimendoza我同意你的看法。如果你能在你的答案中提供一个具体的例子,这将很有帮助。除非你或其他框架使用代理类而不是你的类,例如Hibernate,否则这几乎是正确的。在这种情况下,Hibernate文档建议使用getter而不是direct字段,因为它可能尚未检索到,因为它需要在填充字段值之前执行内部数据库调用。@LuiggiMendoza我假设getter/direct access执行完全相同的操作。如果不是,那么问你是否应该使用其中一个是没有意义的,你必须使用完成你想做的工作的一个。这种方法是主动的@路易吉的回答是被动的。在这种情况下,我喜欢后者。