首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java包装器类

Java包装器类
EN

Stack Overflow用户
提问于 2019-03-08 08:43:30
回答 3查看 70关注 0票数 0

我有一堆类(几个10),它们是从我拥有的.proto文件中生成的。这些类是配置项。所以,假设我有:

代码语言:javascript
运行
复制
class config_item_1 {
    string Id;
    ...
    ...
}

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

我有这些类的实例,它们代表我的系统配置。我在代码中构建逻辑,将它们保存在内存中,执行一些转换,最后,我需要找出哪些对象发生了变化。也就是说,一些对象可能保持不变,一些对象可能消失,一些对象可能改变。

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

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

编辑:

我正在考虑的另一个“技巧”是,由于我的配置项类是从proto文件生成的类,就像我提到的,我正在考虑创建一个包装器proto,如下所示:

代码语言:javascript
运行
复制
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;
        ....
    }
}
EN

回答 3

Stack Overflow用户

发布于 2019-03-08 08:57:33

简单的方法是创建包装器类并扩展/覆盖setter,并将它们用于状态跟踪

票数 0
EN

Stack Overflow用户

发布于 2019-03-08 09:15:44

我相信你需要一个装饰者模式。类似下面的例子。

代码语言:javascript
运行
复制
  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
EN

Stack Overflow用户

发布于 2019-03-08 09:32:21

最初的问题是,生成的代码几乎总是错误的--但有些人坚持认为,让我们充分利用它。

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

代码语言:javascript
运行
复制
class ConfigItem1Wrapper extends config_item_1 {
    public Boolean getStatus()
    {…}
    ...
}

这里的主要问题是你将有大约10个这样的类,所以有很多重复的代码或转发。如果你用来创建这些类的系统也想实例化它们,这也会给你带来问题……如果是这样的话,你将会得到"config_item_1“的实例,而不是名字"ConfigItem1Wrapper”。

您可以将类封装在另一个类中作为委托。这并不像看起来那么糟糕。一些编辑器可以自动创建这样的类。重新创建每个方法,并将调用转发到您在内部存储的副本。

代码语言:javascript
运行
复制
class ConfigItem1Wrapper {
    config_item_1 delegate;

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

如果你可以像这样使用委托(希望使用一些IDE代码生成),这可能是最好的方式,它给了你完全的控制权。

如果您使用Groovy (Java的超集),您会发现它有一个@Delegate注释,可以为您完成所有这些工作。就是这样:

代码语言:javascript
运行
复制
class ConfigItem1Wrapper {
    @Delegate config_item_1 delegate;

    public Boolean getStatus() {
        return status;
    }
}

使用您的附加代码,将生成从config_item_1到ConfigItem1Wrapper的所有方法。我猜这对你没用。真可惜。

老实说,我可以给你的几乎任何其他解决方案都是某种类型的委托。我建议你找到一些让委派工作的方法(而不必手动转发每个方法)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55055117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档