我有一個艱難的我試圖包圍我的頭。我有一些公共接口和一些包私人類,如下所示。java類/接口適配器問題
基本上我的包私有類(以下稱爲UltraDecoder
)需要一些蹩腳的解碼邏輯來解碼數據並對其執行一些操作以供其內部使用。不過,我也想利用這種蹩腳的解碼邏輯用於其他目的。我似乎無法做的是找出一個好方法,將我的蹩腳解碼邏輯作爲外部類可以使用的接口導出,和也可以在內部使用我的UltraDecoder
類,而不會暴露UltraDecoder
的內部細節。
有什麼建議嗎?
/** structured metadata */
public interface Metadata { ... }
/**
* an opaque data item that can be unpackaged
* to zero or more pairs of (Metadata metadata, int value)
*/
public interface DataItem { ... }
public interface SuperDecoder {
...
/** decodes the item and passes each (metadata, value) pair
* to a listener by calling its onUpdate() method
*/
public void decode(DataItem item, SuperDecoderListener listener);
}
public interface SuperDecoderListener {
public void onUpdate(Metadata m, int value);
}
/* package-private classes implementation classes follow */
class UltraDecoder implements SuperDecoder
{
static private class SmartObjectWithMetadata
{
final private Metadata metadata;
public Metadata getMetadata();
}
private interface UltraDecoderListener
{
public void onUpdate(SmartObjectWithMetadata, int value);
}
private void ultraDecode(DataItem item, UltraDecoderListener listener)
{
/* ... does lots of grungework to obtain
the (SmartObjectWithMetadata, value) pairs that correspond to this
DataItem.
Calls listener.onUpdate(smartObject, value) zero or more times.
*/
}
public doSomething()
{
/* ... calls ultraDecode() ... this happens normally */
}
@Override public void decode(DataItem item,
final SuperDecoderListener listener)
{
/* ??? how do we leverage ultraDecode ???
* Below, we can do it but we have to create
* a new adapter object each time.
*/
ultraDecode(item, new UltraDecoderListener() {
@Override public void onUpdate(
SmartObjectWithMetadata smartObject,
int value)
{
listener.onUpdate(smartObject.getMetadata(), value);
}
}
}
}
我不太瞭解你不喜歡上面的代碼。它對我來說很好。 – gpeche 2010-09-16 21:12:30
嘗試顯示如何從外部類中調用此功能,以及從該角度不必要地暴露什麼「內部細節」。 – 2010-09-16 22:33:58