Как имитировать PHP анонимный класс с помощью Java? - PullRequest
0 голосов
/ 03 мая 2019

Я хотел бы реализовать сильную инкапсулированную версию композиции объектов с использованием Java. Мой текущий код в 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 не содержит свойства "text". Итак, возможно ли использовать анонимные классы в Java как в PHP (без имен классов?)

Заранее спасибо.

1 Ответ

1 голос
/ 03 мая 2019

Так что я не 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, и ожидать, что некоторый внешний класс сможет работать с ним, потому что внешний класс не может даже увидеть его определение для его импорта.Но если ваши геттеры и сеттеры полностью охватывают все операторы чтения / записи, это подойдет для вашего варианта использования.

...