Java包装器类

时间:2019-03-08 00:43:30

标签: java protocol-buffers

我有一堆类(大约10秒钟),这些类是从我拥有的.proto文件生成的。这些类是配置项。因此,假设我有:

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

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

我有这些类的实例,它们代表我的系统配置。我正在代码中构建逻辑,以将其保留在内存中,执行一些转换,最后,我需要弄清楚哪些对象已更改。也就是说,有些物体可能会保持原状,有些会消失,有些可能会改变。

因此,对于所有这些类,我需要添加“状态”而不更改实际的类定义。像包装纸一样。

实现此目标的最佳方法是什么?

编辑:

我正在考虑的另一个“ hack”是,因为我的配置项类是从proto文件生成的类,就像我提到的那样,所以我正在考虑创建包装原型,例如:

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 :(得分:0)

直接方法是创建包装器类并扩展/覆盖设置器,并将其用于状态跟踪

答案 1 :(得分:0)

我相信您需要装饰图案。 像下面的例子。

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

}

答案 2 :(得分:0)

最初的问题是生成的代码几乎总是错误的方式-但有些人坚持认为,让我们从中获取最大收益。

您可以扩展类并添加功能。在您的情况下,这可能是个坏主意:

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。我猜这对您不起作用。可惜。

老实说,几乎我能给您的其他解决方案是某种类型的委托。我建议您只是找到一种使委派工作的方法(而不必手动转发每种方法)