因此,我的应用程序公开了这个公共 API,允许客户编写插件。为了这个示例,假设它是一个相当简单的键值对系统,例如:
public interface Key {
// marker interface, guaranteed unique in some scope
}
public interface KVPService {
Set<Key> getKeys();
Object getValue(Key k); // must be a key provided by getKeys() or it blows up
}
现在假设在内部,Key
有一些不应该公开的属性——比如数据库 ID。我目前正在做的是这样的:
/** Internal impl of external Key */
class InternalKey implements Key {
int getDatabaseId() {
// do something...
}
}
/** Internal impl of external KVPService */
class InternalKVPService implements KVPService {
// ...
public Object getValue(Key k) {
InternalKey ik = (InternalKey) k;
return getValueFromDBOrWherever(ik.getDatabaseId());
}
// ...
}
这似乎不太理想。有什么方法可以重新安排职责以避免演员表并仍然保持内部/外部封装?
请注意,在现实世界中它比这要复杂一些。等价物附加了Key
相当多的元数据,除了获得一个简单的值之外,人们可能还想做很多事情,所以仅仅公开,比如说,类似Map.Entry
的对象并不一定能解决问题。
我唯一能想到的就是将内部和外部键完全分开,并保留一个Map<Key, InternalKey>
. 但在那种情况下,我必须复制违反 DRY 的元数据,或者让外部Key
委托到InternalKey
,在这种情况下Map
违反 DRY。
谁能想到更聪明的方法?