Java 用于控制多个子类的超类中的静态变量
我有一个抽象的超类和相当多的子类。每个子类都有多个实例 每个子类都需要使用一些从tar.gz存档中解压的文件。每个子类都有自己独立的tar.gz。即使我有一个子类的多个实例,我只需要为该子类的所有实例解包tar.gz一次。我在每个子类中使用一个静态布尔变量来协调这一点 每个子类都使用相同的(重复的)代码来确定文件是否已解包,然后再尝试解包。我想问的是:有没有一种方法可以将代码移动到超类中,而不是在每个子类中使用一个静态变量和重复的代码来确定子类tar.gz是否已经解包 这里有一些代码,希望能更好地解释Java 用于控制多个子类的超类中的静态变量,java,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;
}
}
}
}
注意:每个子类使用不同的文件路径来解包
正如您所看到的,每个子类共享相同的代码,以确保对该子类的所有实例只解压缩一次存档。我想知道是否有一种很好的方法可以将此代码移动到超类(但保持相同的功能,即解包子类的存档不会阻止子类解包其存档)?是的,父类的静态变量可以被所有子类使用,只要声明为
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;
}
}