我应该使用静态初始化程序还是超类
我有一个名为Parser
的接口。 两个类ParserA, ParserB
实现Parser
。
public interface Parser{
public void initialize();
public int Parse(byte[] data);
}
我对初始化有困惑。 ParserA
初始化两个Maps
。 ParserB
初始化两个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,那么在每个线程上都会发生不必要的伤害。 这真让我困惑。
我有点困惑。
假设Animal
是Tiger, Lion
的基类。 每只动物都会有age, numOfLegs
作为成员。 在每个动物课堂中age, numOfLegs
拥有Animal
课程而不是age, numOfLegs
。 所以Superclass
在这里赢了。 是不是? 如果是这样,我的情况也类似于我所假设的。
既然你是在征求意见,这里是我的2美分:
这两种方法似乎都不需要。 Parser
接口本身的基本思想似乎有点不对。 如果解析器将被静态初始化,为什么你期望解析器的用户调用initialize
方法? 如果程序不调用initialize
并使用parse
方法,程序会做什么?
Parser
接口的目的是解析一个字节[]。 各个实现应该用他们想要的任何逻辑来初始化自己。 因此,我建议您在Parser
删除initialize方法,并让ParserA
和ParserB
在创建时使用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