java类/接口(interface)适配器问题

标签 java oop

我有一个硬汉,我正试图用我的头脑来解决它。我有一些公共(public)接口(interface)和一些包私有(private)类,如下所示。

基本上,我的包私有(private)类(下面称为 UltraDecoder)需要一些蹩脚的解码逻辑来解码数据并对其执行一些操作以供其内部使用。不过,我还想将这种蹩脚的解码逻辑用于其他目的。我似乎无法找到一种好方法将我的蹩脚解码逻辑导出为可供外部类使用的接口(interface),并且仍然在我的 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同一个包中创建一个公共(public)类DecoderUtil。

    public class DecoderUtil {
        public static void decode(SuperDecoder decoder) {
           //do common stuff
           if( decoder instanceof UltraDecoder ){
                //do stuff specific to UltraDecoder
           }
        }
    }

关于java类/接口(interface)适配器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730455/

相关文章:

VB.NET 创建一个带有可选输入的类

javascript - Coffeescript:动态创建调用方法的类的实例

php - 我的工厂是反模式吗?

oop - 如何导出,然后在 Lua 中访问导出的方法

java - java中有没有办法识别调用特定方法的对象?

java - 创建一个可供整个应用程序访问的类

java - 从 ARRAYLIST WITHOUT LOOP 中选择对象 - ANDROID

java - 是否可以根据索引来识别对象?

Java:使用 "UNIXProcess"或 "exec"运行命令时出现 "ProcessBuilder"错误

java - 将图像设置为 JPanel 背景的最简单方法