如何使用 Java 模仿 PHP 匿名 class?

How to mimic PHP anonymous class using Java?

我想使用 Java 实现 object composition 的强大封装版本。我在 PHP 中的当前代码如下:

<?php

class Email {
    private $subject;
    private $body;
    private $recipient;

    public function __construct() {
        $this->subject = new class {
            public $text;
        };
        $this->body = new class {
            public $text;
            public $format;
        };
        $this->recipient = new class {
            public $address;
        };
    }
    public function setSubject($text){
        $this->subject->text = $text;
    }
    //more getters & setters...
}

我在 Java 中尝试过,但没有成功:

public class Email {

    private Subject      subject;
    private Body         body;
    private Recipient    recipient;

    public Email() {
        this.subject = new Object() {
            public String text;
        };
        this.body = new Object() {
            public String text;
            public String format;
        };
        this.recipient = new Object() {
            public String address;
        };
    }

public void setText(String text){
      this.body.text = text;
    }
//more getters & setters...

}

JDK 错误说对象 class 不包含 "text" 属性。 那么,是否可以像在 PHP 中那样在 Java 中使用匿名 classes(没有 classes 名称?)

提前致谢。

所以我不是 PHP 开发人员 -- 我做了 PHP 5 一次就足够了 -- 所以我在 [=20= 的所有方面都不是 100% ] 在这种情况下支持。

不过,我想你想要的是私有内部 classes。 public class 可以拥有只有它可以访问的私有内部 classes。因此,对于您的电子邮件示例 ...

public class Email {
  private Subject      subject;
  private Body         body;
  private Recipient    recipient;

  public Email() {
    this.subject = new Subject();
    this.body = new Body();
    this.recipient = new Recipient();
  }

  public void setText(String text){
    this.body.text = text;
  }
  //more getters & setters...

  private class Subject {
    public String text;
  }
  private class Body {
    public String text;
    public String format;
  }
  private class Recipient {
    public String address;
  }
}

由于主题、正文、收件人是私有内部 classes,外部 classes 看不到它们。所以你不能 return 一个 Body 的实例并期望一些外部 class 能够在它上面工作,因为外部 class 甚至不能 查看 其定义以导入它。但是,如果您的 getter 和 setter 完全包含所有 read/write 运算符,那么应该适合您的用例。