我有一個抽象超類和它的很多子類。每個子類都有多個實例。超類中的靜態變量用於控制多個子類
每個子類都需要使用從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解壓其存檔)?
您可以使用模板方法 – nachokk
如果你想堅持的字段,你總是可以使用反射。只需要聲明該字段,這將完成剩下的工作:http://stackoverflow.com/questions/15439730/field-subclass-accessing-best-way-possible – 2013-07-19 20:13:32
因此,每個SubClass都有自己的文件需要解壓縮? – Joel