java - 我应该使用静态初始值设定项还是父类(super class)

标签 java

我有一个名为Parser 的接口(interface)。两个类 ParserA, ParserB 实现了 Parser

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

我对初始化感到困惑。 ParserA 初始化两个 MapParserB 初始化两个 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,则每个线程都会发生不必要的初始化。这才是真正让我困惑的地方。

我有点糊涂了。

假设 AnimalTiger, Lion 的基类。每个 Animal 都有 age, numOfLegs 作为成员。在每个 Animal 类中使用 Animal 类比使用 age, numOfLegs 更有意义。所以 Superclass 在这里获胜。不是吗?如果是这样,我的场景也与我假设的类似。

最佳答案

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

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

Parser 接口(interface)的目的是解析一个 byte[]。各个实现应该使用他们想要的任何逻辑来初始化自己。因此,我建议您删除 Parser 中的初始化方法,并让 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 的状态是不可变的,那么这些解析器可以毫无问题地与多个线程共享。

关于java - 我应该使用静态初始值设定项还是父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36735611/

相关文章:

java - 如何在elasticsearch中添加where子句

java - 检查是否有任何日历事件/媒体文件已更新

java - 这个递归方法有什么作用呢?

java - 如何通过 gRPC 发送网络钓鱼防护 API key ?

java - 通过命令行运行在 Eclipse IDE 中编写的使用 anltr3 语法的 java 程序

java - 如何禁用 Gradle 组中的所有任务?

java - 如果端点是 https,是否使用 HTTPS

java - HttpClient 发布以从 keycloak 获取 Bearer token

java - 程序编译但未正确写入文件

java - 获取和设置首选项值