2

抽象スーパークラスとそのサブクラスがかなりあります。各サブクラスには複数のインスタンスがあります。

各サブクラスは、tar.gz アーカイブから展開されたいくつかのファイルを使用する必要があります。各サブクラスには、独自の個別の tar.gz があります。サブクラスのインスタンスが複数ありますが、サブクラスのすべてのインスタンスに対して tar.gz を 1 回解凍するだけで済みます。これを調整するために、各サブクラスで静的ブール変数を使用しています。

各サブクラスは、同じ (複製された) コードを使用して、ファイルを展開する前に、ファイルが展開されているかどうかを判断します。私が求めているのは、そのサブクラス 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

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

}
于 2013-07-19T20:11:30.900 に答える