java类/接口适配器问题
我有一个强悍的家伙,我正试图把我的头裹起来。我有一些公共接口和一些包私有类,如下所示 基本上,我的包私有类(下面称为java类/接口适配器问题,java,oop,Java,Oop,我有一个强悍的家伙,我正试图把我的头裹起来。我有一些公共接口和一些包私有类,如下所示 基本上,我的包私有类(下面称为UltraDecoder)需要一些笨拙的解码逻辑来解码数据,并对其执行一些操作以供其内部使用。然而,我也希望将这种笨拙的解码逻辑用于其他目的。我似乎无法找到一种好方法,将我的笨拙解码逻辑导出为可供外部类使用的接口,并且仍然在我的UltraDecoder类内部使用它,而不公开UltraDecoder的内部细节 有什么建议吗 /** structured metadata */ pub
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);
}
}
}
}
在与UltraDecoder相同的包中创建公共类DecoderUtil public class DecoderUtil { public static void decode(SuperDecoder decoder) { //do common stuff if( decoder instanceof UltraDecoder ){ //do stuff specific to UltraDecoder } } } 公共级芦丁{ 公共静态无效解码(超级解码器){ //做普通的事情 if(超级解码器的解码器实例){ //做一些特定于超级解码器的事情 } } }
在与UltraDecoder相同的包中创建公共类DecoderUtil public class DecoderUtil { public static void decode(SuperDecoder decoder) { //do common stuff if( decoder instanceof UltraDecoder ){ //do stuff specific to UltraDecoder } } } 公共级芦丁{ 公共静态无效解码(超级解码器){ //做普通的事情 if(超级解码器的解码器实例){ //做一些特定于超级解码器的事情 } } }
我自己很难理解您的功能需求,但至少听起来您只需要一个
公共抽象类
,其中已经实现了一些“默认”逻辑,然后可以在子类中重用这些逻辑。它叫“世界杯”。在Java集合和IO API中,这一点几乎随处可见。我很难理解您的功能需求,但至少听起来您只需要一个公共抽象类
,其中已经实现了一些“默认”逻辑,然后可以在子类中重用。它叫“世界杯”。在Java集合和IO API中,这一点几乎随处可见。能否在UDL中为onUpdate添加一个重载,该重载采用SDL参数?话虽如此,除非你知道这是个问题,否则我真的不会担心对象创建的开销。你能在UDL中为onUpdate添加一个重载,该重载使用SDL参数吗?话虽如此,我真的不会担心对象创建的开销,除非你知道这是一个问题。我真的不明白你不喜欢上面的代码有什么地方。我觉得还可以。试着展示一下如何从外部类调用它,以及从这个角度看哪些“内部细节”是不必要的。我真的不明白你不喜欢上面的代码。我觉得还可以。试着展示一下如何从外部类调用它,以及从这个角度看哪些“内部细节”被不必要地暴露出来。我看不出这是如何工作的。接口是不同的,我看不出这是怎么回事。接口是不同的。