超类中的静态变量,用于控制多个子类

时间:2013-07-19 19:51:03

标签: java

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

每个子类都需要使用从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解压缩其存档)?

2 个答案:

答案 0 :(得分:2)

您可以采用Template Method

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;
    }

}

答案 1 :(得分:0)

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