2016-04-20 4 views
7

У меня есть интерфейс с именем Parser. Два класса ParserA, ParserB реализует Parser.Должен ли я использовать статический инициализатор или суперкласс

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

У меня путаница с инициализацией. ParserA инициализирует два Maps. ParserB инициализирует два Maps. Но differentData. Maps инициализируются постоянными данными. Средство не от времени выполнения.

Должен ли я использовать подход 1 или 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, в каждой нити возникает ненужная intiailization. Это то, что меня смущает.

Я немного больше смущен.

Предполагается, что Animal является базовым классом для Tiger, Lion. Каждое Животное будет иметь age, numOfLegs в качестве членов. Имеет смысл иметь класс Animal, а не age, numOfLegs в каждом классе животных. Таким образом, Superclass выигрывает здесь. Разве нет? Если это так, мой сценарий также аналогичен этому, я предполагаю.

+0

В Q2 метод getAttr обращается к обеим картам или ParserA.getAttr обращается к карте и парсеру parserB в парсере B? –

+0

Пойдите со вторым вариантом. – EpicPandaForce

+0

@FrancescLordan Да. ParserA.getAttr обращается к карте и парсеру parserB ParserB –

ответ

2

Поскольку вы просите мнение, вот мои 2 цента:

Оба подхода кажутся ненужными. Основная идея интерфейса Parser кажется немного неправильной. Если парсеры будут статически инициализированы, почему вы ожидаете, что пользователи анализатора вызовут метод initialize? Что будет делать программа, если они не назовут initialize и использовать метод parse?

Целью интерфейса Parser является анализ байта []. Отдельные реализации должны инициализировать себя любой логикой, которую они хотят. Поэтому я бы предположил, что вы удаляете метод инициализации в 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 является неизменным, эти Parsers могут совместно использоваться несколькими потоками без каких-либо проблем.

2

я бы пойти на третий вариант

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

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

    public xxxx getAttr(){ 

    } 
} 

Статический блок выполняется только когда загрузчик классов загружает класс, что происходит только один раз независимо от количества потоков. Это позволяет инициализировать статические атрибуты каждого парсера.

Смежные вопросы