Should I use static initializer or super class

7
我有一个名为 Parser 的接口。两个类 ParserAParserB 实现了 Parser 接口。
public interface Parser{
     public void initialize();
     public int Parse(byte[] data);
}

我对初始化有些困惑。 ParserA 初始化了两个MapsParserB 也初始化了两个Maps,但是数据不同。这些Maps是用常量数据初始化的,意味着不是在运行时生成的。
所以我应该使用方法1还是2?
方法1:
class Initializer{
  //have two maps as member
}

Class ParserA extents initializer implements Parser{
       public int Parse(byte[] data){

       }

       public void initialize(){
         //Initialize those maps
       }
}

Similarly for class B

方法2:
class Constants{
   //Static initializer of four maps[two for ParserA, two for ParserB]
}

Class ParserA implements Parser{
       public int Parse(byte[] data){

       }

       public void initialize(){
          //Constants.map1 likewise use.
       }
}

Similarly for class B

在上述用例中,哪种方法更受欢迎?
Q2:在类Initializer中有另一个实用方法。我们称其为getAttr,它使用这两个映射。在这种情况下,哪种方法更好?
Q3 如果我希望多个线程使用这些解析器,并假设我选择了第一种方法,则每个线程都会进行不必要的初始化。这真的让我感到困惑。
我有点困惑。
假设Animal是Tiger和Lion的基类。每个Animal都有年龄和腿的数量作为成员。拥有Animal类而不是在每个Animal类中拥有年龄和腿的数量是有意义的。因此,超类在这里获胜。难道不是吗?如果是这样,我的场景也类似。

在第二季度,getAttr方法访问了两个映射表,或者ParserA.getAttr访问了parserA的映射表和parserB的映射表? - Francesc Lordan
选择第二个选项。 - EpicPandaForce
是的,ParserA.getAttr访问parserA的映射,而ParserB则是ParserB的。 - Gibbs
2个回答

2

既然您在寻求意见,那么这是我的两分钱:

这两种方法都似乎有些不必要。Parser接口的基本思想本身似乎有些错误。如果解析器将被静态初始化,为什么您期望解析器的用户调用initialize方法?如果他们不调用initialize并使用parse方法,程序会怎么做呢?

Parser接口的目的是解析一个byte[]。各个实现应该用他们想要的任何逻辑进行初始化。因此,我建议您删除Parser中的initialize方法,并在创建ParserAParserB时使用Map(或他们可能需要的任何东西)对其进行初始化。

就像这样:

public interface Parser {
    int parser(byte[] data);
}

public class ParserA implements Praser {

    public ParserA() {
        //initialize the maps they use or whatever the data structure that is needed
    }

    public int parser(byte[] data) {
        //logic of parsing
    }
}

//同样适用于ParserB。

对于您的Q2:如果您不暴露内部数据结构并且数据结构的状态是不可变的,这些解析器可以在多个线程之间共享而不会出现任何问题。


2
我会选择第三个选项。
Class ParserA{
    // two maps declaration
    static {
         // maps initialization
    }

    public int ParseA(byte[] data){
        //parse the byte array
     }

    public xxxx getAttr(){

    }
}

静态块只在类加载器加载类时执行,无论线程数量如何,这仅发生一次。这允许您初始化每个解析器的静态属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接