我正在为一个更大的项目(HypergraphDB)中的一些子系统添加实现,我应该避免修改重要的代码。在这个项目中,大约有 70 个 Callable 对象,它们为某些数据库操作定义事务块。我正在替换该数据库,而我的(redis)在定义事务块之前需要所有受影响的键。所以我需要访问这些 Callables 中的部分,并在执行 call() 之前执行一些操作(“watch”)。
一些可调用对象是非平凡的,对于其中一些,我需要在该可调用对象中声明最终字段,并将它们定义为调用的“外部”,因此 call() 和 getHandles() 都可以访问它们。
为了能够访问 getHandles 方法,我定义了一个只有 getHandles 方法的接口。要访问 getHandles,我可以暂时将 Callable 强制转换为该接口,现在在 IDE 中它“看到”该方法,但 atm 我无法测试它。
这行得通吗?
之前的代码:
private HGLiveHandle addLink(final Object payload,
final HGHandle typeHandle,
final HGLink outgoingSet,
final byte flags)
{
return getTransactionManager().ensureTransaction(new Callable<HGLiveHandle>()
{ public HGLiveHandle call() {
HGAtomType type = typeSystem.getType(typeHandle);
HGPersistentHandle pTypeHandle = getPersistentHandle(typeHandle);
HGPersistentHandle valueHandle = TypeUtils.storeValue(HyperGraph.this, payload, type);
......
}
之后的代码:
private HGLiveHandle addLink(final Object payload,
final HGHandle typeHandle,
final HGLink outgoingSet,
final byte flags)
{
return getTransactionManager().ensureTransaction(new Callable<HGLiveHandle>()
{
final HGAtomType type = typeSystem.getType(typeHandle);
final HGPersistentHandle pTypeHandle = getPersistentHandle(typeHandle);
final HGPersistentHandle valueHandle = TypeUtils.storeValue(HyperGraph.this, payload, type);
public HGPersistentHandle[] getHandles() {
HGPersistentHandle[] result = new HGPersistentHandle[3+outgoingSet.getArity()];
result[0] = atomHandle.getPersistent();
result[1] = typeHandle.getPersistent();
result[2] = valueHandle.getPersistent();
result[3] = pTypeHandle;
result[4] = .valueHandle;
return result;
}
public HGLiveHandle call() {.........
接口可处理:
public interface Handable {
public HGPersistentHandle[] getHandles();
}
最后在哪里调用它:
public <V> V ensureTransaction(Callable<V> transaction, HGTransactionConfig config)
{
if (getContext().getCurrent() != null)
try
{
for (HGPersistentHandle ph: ((Handable) transaction).getHandles());
.... writeJedis.watch(ph.toByteArray);
return transaction.call();