Метод для создания похожих экземпляров подкласса с разными параметрами - PullRequest
0 голосов
/ 30 мая 2018

Я сейчас изучаю Java.У меня есть проект с суперклассом (IndexCard), с двумя подклассами (EmployeeIndexCard и CustomerIndexCard).Оба подкласса очень похожи, но они отличаются друг от друга своими переменными экземпляра и, следовательно, своими конструкторами.

Вот они:

class EmployeeIndexCard extends IndexCard {
    public WorkArea workArea ;
    protected String password;

    public employeeIndexCard(String name, String password, String adress, String phone, String email, String workArea) {
        super(name, adress, phone, email);
        this.password = password;
        this.workArea = WorkArea.valueOf(workArea);
    }
}


class CustomerIndexCard extends IndexCard {
    public customerIndexCard(String name, String adress, String phone, String email) {
        super(name, adress, phone, email);
    }
}

Интересно, что я делаюнеправильно, поскольку для создания экземпляров этих классов я создал два очень похожих метода:

/**
 * Create an instance of EmployeeIndexCard.
 */
public static void employeeIndexCard(String name, String dni, String password, String adress, String phone, String email, String workArea) {
    if (Utils.validateDni(dni) && !IndexCard.list.containsKey(dni)) {
        IndexCard.list.put(dni, new EmployeeIndexCard(name, password, adress, phone, email, workArea));
    } else {
        throw new InvalidParameterException();
    }
}

/**
 * Create an instance of CustomerIndexCard.
 */
public static void customerIndexCard(String name, String dni, String adress, String phone, String email) {
    if (Utils.validateDni(dni) && !IndexCard.list.containsKey(dni)) {
        IndexCard.list.put(dni, new FichaCliente(name, adress, phone, email));
    } else {
        throw new InvalidParameterException();
    }
}

Есть ли способ реструктурировать код, чтобы объединить эти два последних метода, которые почти идентичны?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Поскольку ваши два класса имеют общего родителя, наиболее естественный способ рефакторинга кода состоит в том, чтобы выполнить ответственность за создание экземпляра для вызывающей стороны и принять любой экземпляр типа IndexCard:

public static void addIndexCard(String dni, IndexCard indexCard) {
    if (Utils.validateDni(dni) && !IndexCard.list.containsKey(dni)) {
        IndexCard.list.put(dni, indexCard);
    } else {
        throw new InvalidParameterException();
    }
}

Таким образом, вы можете назвать это просто:

//add customer index card:
addIndexCard("dni", new FichaCliente(name, adress, phone, email));

//add employee index card:
addIndexCard("dni2", new EmployeeIndexCard(name, password, adress, 
             phone, email, workArea));
0 голосов
/ 30 мая 2018

Проблема, с моей точки зрения, в том, что вы работаете здесь против объектно-ориентированного проектирования.Вы не предоставили доступ к классу IndexCard, но он должен выглядеть примерно так:

public class IndexCard {

    public static Map<String, IndexCard> map = new HashMap<>();

    private String name;
    private String address;
    private String phone;
    private String email;

    // constructor and accessors ommitted
}

Прежде всего, пожалуйста, не используйте поля public static и предоставляйте средства доступа при необходимости.Это не позволяет другим классам изменять свое состояние напрямую.Вы также можете поместить туда логику проверки:

public class IndexCard {

    private static Map<String, IndexCard> map = new HashMap<>();

    public static void addIndexCard(String dni, IndexCard card) {
        if (Utils.validateDni(dni) && !map.containsKey(dni)) {
            map.put(dni, card);
        } else {
            throw new InvalidParameterException();
        }
    }

    private String name;
    private String address;
    private String phone;
    private String email;

    // constructor and accessors ommitted
}

Вы можете использовать класс следующим образом

IndexCard c1 = new EmployeeIndexCard(name, password, adress, phone, email, workArea);
IndexCard.addIndexCard("c1", c1);
IndexCard c2 = new FichaCliente(name, adress, phone, email);
IndexCard.addIndexCard("c2", c2);
...