为什么所有领域都是公共游戏框架?

时间:2011-07-15 18:57:44

标签: java playframework-1.x

我仍然在质疑为什么使用playframework类中的所有字段都应该公开?

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

一些简短的解释会很好。

据我所知,如果它们是公开的,那么playframework会为它们使用生成的隐形getter和setter吗?但如果他们是私人的,那么......没有吸气剂和二传手,然后我应该自己写呢?

如果它有效,为什么那么这不再是Java了?我想这太简单了。

2 个答案:

答案 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(无论它的相对优点, GroovyJythonJRubyFantom都提供了一种机制,用于创建和访问属性,从而产生与Play正在实现的语法类似的语法; Rhino at至少为调用访问器提供了类似的语法,甚至Scala都有一个更简单的机制来添加访问器。)

答案 1 :(得分:1)

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

这就是Play的设计方式。我没有充分利用它来判断它是好还是坏,但是确实有一个Play使用的所有字节码操作技巧的列表会很好。我不喜欢使用我不理解的东西(要么我会学习它们,要么避免使用它们)。有人知道它们的列出位置(除了源代码)吗?