我有一个名为Parser
的接口(interface)。两个类 ParserA, ParserB
实现了 Parser
。
public interface Parser{
public void initialize();
public int Parse(byte[] data);
}
我对初始化感到困惑。 ParserA
初始化两个 Map
。 ParserB
初始化两个 Map
。但不同的数据。 Maps
使用常量数据进行初始化。表示不是来自运行时。
那么我应该使用方法 1 还是方法 2?
方法一:
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
类中有另一个实用方法。让它成为利用这两个 map 的 getAttr
。在这种情况下,哪种方法更好?
Q3 如果我希望多个线程使用这些解析器
并假设我选择方法 1,则每个线程都会发生不必要的初始化。这才是真正让我困惑的地方。
我有点糊涂了。
假设 Animal
是 Tiger, Lion
的基类。每个 Animal 都有 age, numOfLegs
作为成员。在每个 Animal 类中使用 Animal
类比使用 age, numOfLegs
更有意义。所以 Superclass
在这里获胜。不是吗?如果是这样,我的场景也与我假设的类似。
最佳答案
既然你是在征求意见,这是我的 2 美分:
这两种方法似乎都没有必要。 Parser
接口(interface)的基本思想本身似乎有点错误。如果解析器将被静态初始化,为什么您期望解析器的用户调用 initialize
方法?如果他们不调用 initialize
并使用 parse
方法,程序会做什么?
Parser
接口(interface)的目的是解析一个 byte[]。各个实现应该使用他们想要的任何逻辑来初始化自己。因此,我建议您删除 Parser
中的初始化方法,并让 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 的状态是不可变的,那么这些解析器可以毫无问题地与多个线程共享。
关于java - 我应该使用静态初始值设定项还是父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735611/