我有一堆类(几个10),它们是从我拥有的.proto文件中生成的。这些类是配置项。所以,假设我有:
class config_item_1 {
string Id;
...
...
}
class config_item_2 {
string Id;
...
...
}
我有这些类的实例,它们代表我的系统配置。我在代码中构建逻辑,将它们保存在内存中,执行一些转换,最后,我需要找出哪些对象发生了变化。也就是说,一些对象可能保持不变,一些对象可能消失,一些对象可能改变。
因此,对于所有这些类,我需要在不更改实际类定义的情况下添加“状态”。就像包装纸一样。
实现这一目标的最佳方法是什么?
编辑:
我正在考虑的另一个“技巧”是,由于我的配置项类是从proto文件生成的类,就像我提到的,我正在考虑创建一个包装器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;
....
}
}
发布于 2019-03-08 08:57:33
简单的方法是创建包装器类并扩展/覆盖setter,并将它们用于状态跟踪
发布于 2019-03-08 09:15:44
我相信你需要一个装饰者模式。类似下面的例子。
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;
}
}
发布于 2019-03-08 09:32:21
最初的问题是,生成的代码几乎总是错误的--但有些人坚持认为,让我们充分利用它。
您可以扩展类并添加功能。在您的情况下,这可能是一个坏主意:
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的所有方法。我猜这对你没用。真可惜。
老实说,我可以给你的几乎任何其他解决方案都是某种类型的委托。我建议你找到一些让委派工作的方法(而不必手动转发每个方法)
https://stackoverflow.com/questions/55055117
复制相似问题