Сериализация GWT и шаблон декоратора - PullRequest
3 голосов
/ 20 июля 2010

Я использую шаблон декоратора для описания действий, и я хотел бы использовать эти действия в вызовах RPC

public abstract class Action implement Serializable
{
  boolean       isDecorated = false;
  public Action() {} // default constructor for Serialization
}

public abstract class ActionDecorator extends Action
{
  private   Action  _decoratedAction;

  public ActionDecorator()  // default constructor for Serialization
  {}

  public ActionDecorator(Action action)
  {
    _decoratedAction = action;
    _decoratedAction.isDecorated = true;
  }
}

После транзакции я получаю DecoratorAction, который содержит действие, но элемент isDecorated для _decoratedAction имеет значение false.

Поскольку конструктор по умолчанию (с нулевым аргументом) вызывается для восстановления моего объекта, и мой декоратор, и мои декорированные действия получают значение по умолчанию isDecorated (false).

Я не могу скопировать "_decoratedAction.isDecorated = true;" в конструкторе с нулевым аргументом ActionDecorator, потому что _decoratedAction не инициализируется (ноль) в это время.

Конечно, я мог бы вручную устанавливать логическое значение после каждой транзакции, но было бы лучше избегать дополнительной инициализации объекта (которую можно забыть) каждый раз, когда мои коллеги хотят использовать объект Action ...

Ответы [ 4 ]

1 голос
/ 10 августа 2010

Я попробовал ваш код, и он работает так, как ожидалось.

Я использовал Action и ActionDecorator , как вы опубликовали, но я сделал _decoratedAction общедоступным, чтобы я мог проверить его значение.

Затем я подклассифицировал оба класса:

class MyAction extends Action {
    public MyAction() {}
}

class MyActionDecorator extends ActionDecorator {
    public MyActionDecorator() {}
    public MyActionDecorator(Action a) {
        super(a);
    }
}

и объявил метод службы, который будет возвращать действие . Это его реализация:

public Action getAction() {
    return new MyActionDecorator(new MyAction());
}

После вызова службы с клиента я печатаю состояние действия:

System.out.println(action.isDecorated); // false
System.out.println(((ActionDecorator) action)._decoratedAction.isDecorated); // true

Все как и ожидалось: isDecorated из ActionDecorator ложно, а isDecorated из Действия, украшенного им, - правда. Надеюсь, это поможет в определении вашей проблемы. Если нет, пожалуйста, предоставьте более подробную информацию.

0 голосов
/ 13 августа 2010

Это просто неправильно написанный шаблон декоратора. Декоратор должен делегировать все нереализованные методы для декорируемого объекта. Поэтому в вашем случае у вас должен быть соответствующий метод доступа (метод получения / установки) для isDecorated как в Action, так и в ActionDecorator. Методы доступа в ActionDecorator должны делегировать запрос объекту _decoratedAction.

0 голосов
/ 07 августа 2010

Что происходит с объектами Action в вызове RPC? Они где-то сохранились? Если это так, то ваши определения постоянства могут быть неверными.

0 голосов
/ 20 июля 2010

Возможно, вы могли бы превратить isDecorated в метод, чтобы он всегда возвращал false в Action, и переопределять его в ActionDecorator, чтобы всегда возвращать true. Какова цель isDecorated? Почему Action или его пользователям нужно знать, украшен ли Action или нет?

...