2014-02-01 2 views
0

В моем классе есть поле, представляющее массив объектов, которые реализуют некоторый интерфейс каждый по-другому. Более точно, каждый объект в массиве имеет метод для анализа файла некоторого типа и метода, который возвращает соответствующее поддерживаемое расширение файла. Также мой класс имеет набор, который заполняется путем разбора файла.Инкапсуляция поля, представляющего массив объектов

private MyInterface[] myArray = new MyInterface[] { 

    new MyInterface() { 
     @Override 
     public void parseFile(File file){/*parsing TXT*/} 
     @Override 
     public String getSupportedFileExtension(){return "txt";} 
    }, 

    new MyInterface() { 
     @Override 
     public void parseFile(File file){/*parsing XML*/} 
     @Override 
     public String getSupportedFileExtension(){return "xml";}, 

    },    
}; 

Мое рассуждение, основанное на этом подходе, заключается в том, чтобы поддерживать все поддерживаемые возможности анализа файлов в одном фрагменте кода. Я хочу, чтобы этот массив использовался как внутри, так и вне класса.

Если я возвращаю этот массив через геттер, существует риск установить его на нуль, например, и разбить программу. Так что вопросы:

  1. Если я делаю массив окончательным, это нормально или есть лучшие способы?
  2. Является ли это хорошим подходом к программированию, или я должен вообще избегать такого подхода?
  3. Как другие люди делают такие вещи?

Спасибо!

+0

Я думаю, что создание конкретных подклассов - это правильная идея. –

ответ

1

Лучший способ сделать это - использовать factory pattern. В вашем случае у вас есть фабрика, которая получает расширение файла и возвращает объект, который реализует интерфейс синтаксического анализа. Таким образом, вы можете добавить больше парсеров позже, не меняя код, и у вас есть одна точка, где можно запросить возможности синтаксического анализа.

IFileparser parser = ParseFactory.getParser("text") 
IContent content = parser.parseFile(file) 

Вы можете увеличить завод, чтобы вернуть поддерживаемые расширения файлов, Sinch завод знает все implementationn он держит.

+0

Спасибо! Но я также хочу, чтобы пользователь мог использовать цикл «для каждого», например, для заполнения фильтров JFileChooser. – Roman

+0

В этом случае фабрика будет вызывать исключение, не поддерживаемое поддержкой. – Hannes

+0

Извините, слишком поменял мои комментарии – Roman

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