我仍然在质疑为什么使用playframework类中的所有字段都应该公开?
class A {
public int a;
public int b;
}
一些简短的解释会很好。
据我所知,如果它们是公开的,那么playframework会为它们使用生成的隐形getter和setter吗?但如果他们是私人的,那么......没有吸气剂和二传手,然后我应该自己写呢?
如果它有效,为什么那么这不再是Java了?我想这太简单了。
答案 0 :(得分:8)
文档provides an explanation for this。 Play打破了许多Java惯例,旨在使代码更具可读性。
基本上,如果你要写:
class A {
private int x;
public int getX() { return x; }
public void setX(int x) { this.x = x; }
}
为什么不让框架为你生成getter和setter(similar to 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 at至少为调用访问器提供了类似的语法,甚至Scala都有一个更简单的机制来添加访问器。)
答案 1 :(得分:1)
Play框架在幕后进行了大量的字节码操作,以实现比Java更好的语法。因此,即使代码看起来像Java,它也有不同的语义 - 使用字段或调用方法并不总是按照您的想法执行。
这就是Play的设计方式。我没有充分利用它来判断它是好还是坏,但是确实有一个Play使用的所有字节码操作技巧的列表会很好。我不喜欢使用我不理解的东西(要么我会学习它们,要么避免使用它们)。有人知道它们的列出位置(除了源代码)吗?