Дубликат кода JAVA

113
17 сентября 2019, 20:50

Есть приложение, состоящее из нескольких maven-modules. В каждом модуле есть Класс, который просто заполняет, хранит и в методах возвращает два List<>. Эти List<> похожи друг на друга, но отличаются тем, что в них хранится. Среда разработки определяет эти коллекции, как дубликат кода. Подскажите, как от этого избавиться. Вот пример такого класса:

public class ImageListCommandsAndOptions {
private List<OptionDescription> options = new ArrayList<>();
private List<CommandDescription> commands = new ArrayList<>();
private OptionDescription urlImage = new OptionDescription
        ("url", "u", "resource address on the Internet", true);
private OptionDescription dirImage = new OptionDescription
        ("dir", "d", "absolute path of saving file", true);
private OptionDescription nameImage = new OptionDescription
        ("name", "n", "name of image file", true);
private OptionDescription pathImage = new OptionDescription
        ("path", "p", "path of image", true);
private OptionDescription descriptionImage = new OptionDescription
        ("specification", "s", "image description", true);

private CommandDescription download = new CommandDescription("download", "d", "download image to file", new DownloadCommand(), urlImage, dirImage);
private CommandDescription help = new CommandDescription("help", "h", "help", new HelpCommand(commands));
private CommandDescription saveDb = new CommandDescription("save", "s", "save to database", new DatabaseSaveCommand(), nameImage, pathImage, descriptionImage);
private CommandDescription removeDb = new CommandDescription("remove", "r", "remove record from Database", new DatabaseDeleteCommand(), nameImage);
private CommandDescription viewDb = new CommandDescription("view", "v", "show position in the database", new DatabaseSearchCommand(), nameImage);

public List<OptionDescription> getImageOptions(){
    options.add(urlImage);
    options.add(dirImage);
    options.add(nameImage);
    options.add(pathImage);
    options.add(descriptionImage);
    return options;
}
public List<CommandDescription> getImageCommands(){
    commands.add(download);
    commands.add(help);
    commands.add(saveDb);
    commands.add(removeDb);
    commands.add(viewDb);
    return commands;
}}

В частности, в этом Классе, пятью элементами заполняется один List<> и пятью элементами - второй. Это воспринимается, как дубликат кода.

Answer 1

Замечания среды разработки настраиваемые и не всегда справедливы к конкретной ситуации. Я бы на вашем месте не заморачивался именно с удалением дубликатов в данном случае. У вас тут другая проблема - нужно заполнять списки один раз, при создании ImageListCommandsAndOptions, а то сейчас у вас при каждом вызове getImageOptions будет вставка в список и после, например, трех вызовов этого метода ваш список будет состоять из 15 элементов, среди которых 3 одинаковых набора по 5 штук.

private final List<OptionDescription> options = Arrays.asList(urlImage, dirImage, nameImage, pathImage, descriptionImage);
private final List<CommandDescription> commands = Arrays.asList(download, help, saveDb, removeDb, viewDb);
public List<OptionDescription> getImageOptions(){
    return options;
}
public List<CommandDescription> getImageCommands(){
    return commands;
}
Answer 2

Как вариант, можно использовать Collections.addAll(collection, elements...), который позволяет в одну строку заполнить список:

public List<OptionDescription> getImageOptions(){
    Collections.addAll(options, urlImage, dirImage, nameImage, pathImage, descriptionImage);
    return options;
}
public List<CommandDescription> getImageCommands(){
    Collections.addAll(commands, download, help, saveDb, removeDb, viewDb);
    return commands;
}
READ ALSO
Передача значения объекта из Java в с++

Передача значения объекта из Java в с++

Читаю книгу про компиляторы(книга дракона), разбираюсь как лексические и синтаксические анализаторы программируютсяВ конце книги есть пример...

146
Синхронизация данных в базах данных

Синхронизация данных в базах данных

Хочу импленментировать синхронизацию баз данных между удаленными машинамиВсе происходит так: embedded система собирает данные и при возможности...

141
О нотация, разбор определения

О нотация, разбор определения

Читаю Седживка, до этого момента было все понятно:

109
ConcurrentModificationException

ConcurrentModificationException

Здравствуйте, постоянно получаю ошибку, когда пытаюсь добавить объекты на картуГугл мне не дал ясности, стек оверфлоу я тоже, не понял, что...

174