我应该使用静态初始化器还是超级类

时间:2016-04-20 06:34:51

标签: java

我有一个名为Parser的界面。两个类ParserA, ParserB实现了Parser

public interface Parser{
     public void initialize();
     public int Parse(byte[] data);
}

我对初始化感到困惑。 ParserA初始化了两个MapsParserB初始化了两个Maps。但是不同的数据。使用常量数据初始化Maps。意思不是来自运行时。

那么我应该使用approach1还是2?

Approach1:

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

Approach2:

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 如果我想要multiple threads to use these parsers并假设我选择方法1,则每个线程都会发生不必要的内部化。这真让我感到困惑。

我有点困惑。

假设AnimalTiger, Lion的基类。每个Animal都有age, numOfLegs个成员。拥有Animal类而不是每个Animal类中都有age, numOfLegs是有意义的。所以Superclass赢了。 ISN'吨?如果是这样,我的情况也类似于我的假设。

2 个答案:

答案 0 :(得分:2)

既然你在征求意见,这是我的2美分:

这两种方法似乎都没有必要。 Parser界面本身的基本思想似乎有点不对劲。如果解析器将被静态初始化,为什么您希望解析器的用户调用initialize方法?如果他们不拨打initialize并使用parse方法,该计划会做什么?

Parser接口的目的是解析byte []。各个实现应该使用他们想要的逻辑来初始化自己。因此,我建议您删除Parser中的初始化方法,并在创建地图时将ParserAParserB初始化为地图(或其他可能需要的内容)。< / p>

类似的东西:

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:如果你没有暴露内部DS并且DS的状态是不可变的,这些解析器可以与多个线程共享而没有任何问题。

答案 1 :(得分:2)

我会选择第三个选项

Class ParserA{
    // two maps declaration
    static {
         // maps initialization
    }

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

    public xxxx getAttr(){

    }
}

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