【问题标题】:How to mimic PHP anonymous class using Java?如何使用 Java 模仿 PHP 匿名类?
【发布时间】:2019-05-02 22:47:26
【问题描述】:

我想使用 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 错误指出 Object 类不包含“文本”属性。 那么,是否可以像在 PHP 中一样在 Java 中使用匿名类(没有类名?)

提前致谢。

【问题讨论】:

    标签: java composition anonymous-class


    【解决方案1】:

    所以我不是 PHP 开发人员——我做过一次 PHP 5,这就足够了——所以我不是 100% 了解 PHP 在这种情况下支持的所有方面。

    但是,我认为您想要的是私有内部类。公共类可以有只有它可以访问的私有内部类。因此,对于您的电子邮件示例...

    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;
      }
    }
    

    由于 Subject、Body、Recipient 是私有的内部类,外部类看不到它们。因此,您不能返回 Body 的实例并期望某个外部类能够对其进行处理,因为外部类甚至无法查看它的定义来导入它。但是,如果您的 getter 和 setter 完全包含所有适合您的用例的读/写运算符。

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多