Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法创建具有不同参数的类似子类实例_Java_Methods_Refactoring_Subclass - Fatal编程技术网

Java 方法创建具有不同参数的类似子类实例

Java 方法创建具有不同参数的类似子类实例,java,methods,refactoring,subclass,Java,Methods,Refactoring,Subclass,我目前正在学习Java。我有一个带有超类(IndexCard)的项目,它有两个子类(EmployeeIndexCard和CustomerIndexCard)。这两个子类非常相似,但它们的实例变量彼此不同,因此其构造函数也不同 这是: class EmployeeIndexCard extends IndexCard { public WorkArea workArea ; protected String password; public employeeIndexCa

我目前正在学习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();
    }
}

有没有办法重组代码以合并这两个几乎相同的最后方法?

从我的角度来看,问题是,您在这里使用的是面向对象的设计。您没有提供对类
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
}
你可以像这样使用这个类

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);

由于您的两个类共享一个父类,因此重构代码的最自然的方法是将创建实例的责任交给调用方,并接受
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));

对于初学者,请不要给方法提供带有大写字母的类的名称。这只会造成混乱。你为什么需要这些方法呢?只需将验证移到构造函数中。@Kayaman如果我将验证移到构造函数中,它不是仍然是重复的代码吗?您可以将公共部分放在超类构造函数中。现在,您可以使用构造函数(它们没有得到验证)或使用您创建的方法创建对象。
//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));