我有一个名为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
的基类。每个Animal都有age, numOfLegs
个成员。拥有Animal
类而不是每个Animal类中都有age, numOfLegs
是有意义的。所以Superclass
赢了。 ISN'吨?如果是这样,我的情况也类似于我的假设。
答案 0 :(得分:2)
既然你在征求意见,这是我的2美分:
这两种方法似乎都没有必要。 Parser
界面本身的基本思想似乎有点不对劲。如果解析器将被静态初始化,为什么您希望解析器的用户调用initialize
方法?如果他们不拨打initialize
并使用parse
方法,该计划会做什么?
Parser
接口的目的是解析byte []。各个实现应该使用他们想要的逻辑来初始化自己。因此,我建议您删除Parser
中的初始化方法,并在创建地图时将ParserA
和ParserB
初始化为地图(或其他可能需要的内容)。< / 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(){
}
}
静态块仅在类加载器加载类时执行,不管线程数如何都只发生一次。这允许您初始化每个解析器的静态属性。