文档对此进行了解释。Play 打破了许多 Java 惯例,旨在使代码更具可读性。
基本上,如果你只是要写:
class A {
private int x;
public int getX() { return x; }
public void setX(int x) { this.x = x; }
}
为什么不让框架为您生成 getter 和 setter(类似于 C#)?当然,由于如文档中所述,生成的 getter 和 setter 仅在运行时可用,因此需要将字段声明为 public,以便 Java 编译器在类外部的代码访问变量时不会引发错误。
基本上,这允许您编写:
class A {
public int x;
}
class B {
public void process() {
A a = new A();
a.x = 42;
}
}
代替:
class B {
public void process() {
A a = new A();
a.setX(42);
}
}
更好的是,如果您需要 getter 或 setter 中的特定逻辑,您可以将其添加进去,例如:
class A {
public int x;
public void setX(int x) {
if (x < 0) throw new IllegalArgumentException("x must be positive");
this.x = x;
}
}
并且仍然像这样使用它:
class B {
public void process() {
A a = new A();
a.x = 42;
}
}
当然,这是否是处理事情的正确方法是一个见仁见智的问题,但是对于 Java 开发人员来说,寻找更简单的方法来编写所有这些样板的 getter 和 setter 是很常见的(不管它的相对优点是什么,Groovy、Jython、JRuby和Fantom都提供了一种创建和访问属性的机制,其语法类似于 Play 正在实现的语法;Rhino至少为调用访问器提供了类似的语法,甚至Scala也有一个更简单的机制来添加访问器)。