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

Java 用于控制多个子类的超类中的静态变量,java,Java,我有一个抽象的超类和相当多的子类。每个子类都有多个实例 每个子类都需要使用一些从tar.gz存档中解压的文件。每个子类都有自己独立的tar.gz。即使我有一个子类的多个实例,我只需要为该子类的所有实例解包tar.gz一次。我在每个子类中使用一个静态布尔变量来协调这一点 每个子类都使用相同的(重复的)代码来确定文件是否已解包,然后再尝试解包。我想问的是:有没有一种方法可以将代码移动到超类中,而不是在每个子类中使用一个静态变量和重复的代码来确定子类tar.gz是否已经解包 这里有一些代码,希望能更好

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

每个子类都需要使用一些从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;
            }
        }
    }
}
注意:每个子类使用不同的文件路径来解包


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

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

您可以采用

和在子类中

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

}

你可以使用模板方法如果你想坚持使用字段,你可以始终使用反射。只需声明字段,其余的就可以了:因此每个子类都有自己需要解包的文件?是的,每个子类解包的是不同的文件。一旦它被子类的一个实例解包,就不需要再解包了我想他不是在寻找这个,如果你仔细阅读的话,我不希望Subassa能够影响正在解包的文件的Subassb状态。我知道它们都可以在超类中共享同一个静态变量。我正在寻找一种好方法来避免子类中的代码重复,如上所示。
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;
    }

}