我有一堆类(大约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;
....
}
}
答案 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。我猜这对您不起作用。可惜。
老实说,几乎我能给您的其他解决方案是某种类型的委托。我建议您只是找到一种使委派工作的方法(而不必手动转发每种方法)