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参数吗?话虽如此,我真的不会担心对象创建的开销,除非你知道这是一个问题。

我真的不明白你不喜欢上面的代码有什么地方。我觉得还可以。试着展示一下如何从外部类调用它,以及从这个角度看哪些“内部细节”是不必要的。我真的不明白你不喜欢上面的代码。我觉得还可以。试着展示一下如何从外部类调用它,以及从这个角度看哪些“内部细节”被不必要地暴露出来。我看不出这是如何工作的。接口是不同的,我看不出这是怎么回事。接口是不同的。