2

我有一个抽象超类和它的很多子类。每个子类有多个实例。

每个子类都需要使用一些从 tar.gz 存档中解压缩的文件。每个子类都有自己独立的 tar.gz。即使我有一个子类的多个实例,我只需要为子类的所有实例解压一次 tar.gz。我在每个子类中使用一个静态布尔变量来协调它。

每个子类都使用相同的(重复的)代码来确定文件是否已在尝试解包之前被解包。我要问的是:有没有办法将代码移动到超类,而不是使用静态变量和每个子类的重复代码来确定子类 tar.gz 是否已解包?

这是一些代码,希望能更好地解释一下。

public abstract class SuperClassA
{
    public void unpack() throws IOException
    {
      // default implementation to unpack the files
      // without checking if they've been unpacked
    }
}

public class SubClassA extends SuperClassA
{
    private static Boolean m_firmwareUnpacked = false;

    // Ensures the files are unpacked only once for this subclass
    @Override
    protected void unpack() throws IOException
    {
        synchronized( m_firmwareUnpacked )
        {
            if( m_firmwareUnpacked == false )
            {
                super.unpack();
                m_firmwareUnpacked = true;
            }
        }
    }
}

public class SubClassB extends SuperClassA
{
    private static Boolean m_firmwareUnpacked = false;

    // Ensures the files are unpacked only once for this subclass
    @Override
    protected void unpack() throws IOException
    {
        synchronized( m_firmwareUnpacked )
        {
            if( m_firmwareUnpacked == false )
            {
                super.unpack();
                m_firmwareUnpacked = true;
            }
        }
    }
}

请注意,每个子类都使用不同的文件路径来解包。

正如您所看到的,每个子类共享相同的代码,以确保只为该子类的所有实例解压缩一次存档。我想知道是否有将此代码移动到超类的好方法(但保持相同的功能,即解压缩 SubClassA 的存档不会阻止 SubClassB 解压缩其存档)?

4

2 回答 2

2

您可以采取模板方法的方法

public abstract class SuperClassA
{
    //this is the template method
   public void unpack() throws IOException
   {
             if(isValid()){
                templateUnpack();
                setValid(false);
             }

    }

    protected abstract boolean isValid();

    public void templateUnpack() throws Exception {
        //unpack code here
    }
    protected abstract void setValid(boolean b);

}

在子类中

public class SubClassA extends SuperClassA
{
    private static Boolean m_firmwareUnpacked = false;

    @Override
    public boolean isValid(){
      return m_firmwareUnpacked;
    }


    @Override
    protected void setValid(boolean b){
       m_firmwareUnpacked = b;
    }

}
于 2013-07-19T20:11:30.900 回答
0

是的,只要声明publicprotected(不是private),所有子类都可以使用父类的静态变量。然后将保持一致的值,除非子对象之一对其进行修改。

于 2013-07-19T19:57:25.273 回答