5

我仍然有一个问题,为什么使用 playframework 类中的所有字段都应该是公开的?

class A {
  public int a;
  public int b;
}

一些简短的解释会很好。

据我所知,如果它们是公开的,那么 playframework 会为它们使用生成的不可见的 getter 和 setter 吗?但是,如果它们是私有的,那么.. 没有 getter 和 setter,那么我应该自己编写它们吗?

如果它这样工作,那么为什么这不再是 Java 了?我猜太简单了,无法理解。

4

2 回答 2

8

文档对此进行了解释。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 是很常见的(不管它的相对优点是什么,GroovyJythonJRubyFantom都提供了一种创建和访问属性的机制,其语法类似于 Play 正在实现的语法;Rhino至少为调用访问器提供了类似的语法,甚至Scala也有一个更简单的机制来添加访问器)。

于 2011-07-15T19:14:44.690 回答
1

Play 框架在幕后进行了大量的字节码操作,以实现比 Java 更好的语法。因此,即使代码看起来像 Java,它也有不同的语义——使用字段或调用方法并不总是像你认为的那样。

这就是 Play 的设计方式。我还没有充分使用它来就它是好事还是坏事发表意见,但如果有一份 Play 使用的所有字节码操作技巧的列表肯定会很好。我不喜欢使用我不理解的东西(我要么学习它们,要么避免它们)。有人会知道它们在哪里列出(除了源代码)?

于 2011-07-15T19:20:45.980 回答