我应该使用静态初始化程序还是超类

我有一个名为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的基类。 每只动物都会有age, numOfLegs作为成员。 在每个动物课堂中age, numOfLegs拥有Animal课程而不是age, numOfLegs 。 所以Superclass在这里赢了。 是不是? 如果是这样,我的情况也类似于我所假设的。


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

这两种方法似乎都不需要。 Parser接口本身的基本思想似乎有点不对。 如果解析器将被静态初始化,为什么你期望解析器的用户调用initialize方法? 如果程序不调用initialize并使用parse方法,程序会做什么?

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

就像是:

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的状态是不可改变的,这些解析器可以与多个线程共享,而没有任何问题。


我会去第三个选择

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

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

    public xxxx getAttr(){

    }
}

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

链接地址: http://www.djcxy.com/p/91409.html

上一篇: Should I use static initializer or super class

下一篇: Twitter OAuth Rest Api Status Parameter '@' symbol