Java访问修饰符最佳实践
这似乎是一个基本的问题,但我想把它弄对 我有一门课叫“AWorld”。在该类中,我有一个根据用户设置的贴图大小绘制边框的方法 如果变量“mapSize”是私有的,但我想从同一个类中访问它的值,那么直接引用它还是使用getter方法更合适 下面的代码应该解释我想知道的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;
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实例,我把它作为示例代码放在一起问这个问题,因为我使用的类相当长。为了回答您的问题,一般做法是使用字段asmapSize
或this.mapSize
如果类iffinal
。如果它不是最终的,并且有可能超载该值,您可能会考虑<代码> GETMAPMASIZEX/CODE >,但您增加了可能不需要的复杂性。@ JohnB,您搞错了。OP想知道如何在代码中使用newWorld#mapSize
。你是说newWorld.mapSize==mapSize吗?@Yazan我不是这个意思。@luigimendoza我同意你的看法。如果你能在你的答案中提供一个具体的例子,这将很有帮助。除非你或其他框架使用代理类而不是你的类,例如Hibernate,否则这几乎是正确的。在这种情况下,Hibernate文档建议使用getter而不是direct字段,因为它可能尚未检索到,因为它需要在填充字段值之前执行内部数据库调用。@LuiggiMendoza我假设getter/direct access执行完全相同的操作。如果不是,那么问你是否应该使用其中一个是没有意义的,你必须使用完成你想做的工作的一个。这种方法是主动的@路易吉的回答是被动的。在这种情况下,我喜欢后者。