Классы Java Wrapper - PullRequest
       19

Классы Java Wrapper

0 голосов
/ 08 марта 2019

У меня есть несколько классов (несколько десятков), которые были сгенерированы из моих файлов .proto. Эти классы являются элементами конфигурации. Итак, допустим, у меня есть:

class config_item_1 {
    string Id;
    ...
    ...
}

class config_item_2 {
    string Id;
    ...
    ...
}

У меня есть экземпляры этих классов, которые представляют конфигурацию моей системы. Я строю логику в своем коде, чтобы сохранить их в памяти, выполняя некоторые преобразования, и в конце мне нужно выяснить, какие объекты изменились. То есть некоторые объекты могут остаться нетронутыми, некоторые могут исчезнуть, некоторые могут измениться.

Итак, для всех этих классов мне нужно добавить «статус» без изменения фактических определений классов. Что-то вроде обертки.

Каков наилучший способ достичь этого?

EDIT:

Другой «хак», который я рассматриваю, заключается в том, что, поскольку мои классы элементов конфигурации сгенерированы классами из файла прото, как я уже говорил, я думаю о создании прото-оболочки, как это:

message ConfigCacheItem {
    enum ItemState {
        UNTOUCHED = 0;
        CREATED = 1;
        UPDATED = 2;
        DELETED = 3;
    }
    ItemState item_state = 1;
    String id = 2; /* ID stashed from one of the items below for lookup */
    oneof config_item {
        ConfigItem1 config_item_1 = 3;
        ConfigItem2 config_item_2 = 4;
        ....
    }
}

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Я считаю, что вам нужен шаблон декоратора. Что-то вроде примера ниже.

  public class Decorator_config_item_1 {
    private config_item_1 item_1;
    private Boolean status;

    public Decorator_config_item_1(config_item_1 item_1) {
        this.config_item_1 = item_1;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }

}
0 голосов
/ 08 марта 2019

Первоначальная проблема заключается в том, что сгенерированный код почти всегда является неправильным путем - хотя некоторые люди настаивают на этом, поэтому давайте извлечем из него максимум пользы.

Вы можете расширить класс и добавить функциональность.Это, вероятно, плохая идея в вашем случае:

class ConfigItem1Wrapper extends config_item_1 {
    public Boolean getStatus()
    {…}
    ...
}

Основная проблема здесь в том, что у вас будет ~ 10 из этих классов, поэтому много дублирующегося кода или пересылки.Это также создаст вам проблемы, если любая система, которую вы используете для создания этих классов, также захочет создать их экземпляр ... если это произойдет, вы получите экземпляры "config_item_1" вместо более удивительно названного "ConfigItem1Wrapper"

Вы можете инкапсулировать класс в другой класс в качестве делегата.Это не так плохо, как кажется.Некоторые редакторы могут автоматически создавать такие классы.Каждый метод создается заново, и вызов перенаправляется на внутреннюю копию, которую вы храните.

class ConfigItem1Wrapper {
    config_item_1 delegate;

    String some_method1(var) {
        return delegate.some_method1(var);
    }
}

Если вы можете использовать такое делегирование (надеюсь, с помощью генерации кода некоторых сред IDE), это может быть лучшим способом, этодает вам полный контроль.

Если бы вы использовали Groovy (расширенный набор Java), вы обнаружите, что он имеет аннотацию @Delegate, которая делает все это за вас.Просто так:

class ConfigItem1Wrapper {
    @Delegate config_item_1 delegate;

    public Boolean getStatus() {
        return status;
    }
}

сгенерирует все методы из config_item_1 в ConfigItem1Wrapper с вашим дополнительным кодом.Я предполагаю, что это не сработает для вас.Жаль.

Честно говоря, почти любое другое решение, которое я мог бы дать вам, - это своего рода делегирование.Я рекомендую вам просто найти способ заставить делегирование работать (без необходимости перенаправлять каждый метод вручную)

0 голосов
/ 08 марта 2019

Прямой путь - создать класс-оболочку и установить / расширить / переопределить сеттер и использовать их для отслеживания вашего статуса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...