在构造函数中添加组而不是仅添加一个组

时间:2014-12-02 09:46:38

标签: java

很抱歉,如果我有点模糊,但在不是我的母语和我是初学者之间,我会尽力将问题说清楚。

即使在谷歌搜索之后,我仍然陷入了无法找到任何解决方案的练习中。至少不是我理解的东西。

我必须创建两个构造函数,其中一个除变量外,接收一组教师,另一个只接收一个教师。

private Set<Teacher> teacher;

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher teacher) {
    super(TipoLugar.OTRO, nombre, planta, aforo);
    this.teacher = new HashSet<Teacher>();
}

我找不到任何关于如何使它们与众不同的内容,因此一个构造函数只添加1个教师,另一个添加一些教师。感谢您的帮助,如果您也链接了一些资源,那将是非常可爱的。

5 个答案:

答案 0 :(得分:1)

如果您至少需要一位教师(其他人可以是可选的),即一对多关系,则不需要两个构造函数。只需varargs参数即可。

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher required, Teacher... moreTeachers) {
    super(TipoLugar.OTRO, nombre, planta, aforo);
    this.teacher = new HashSet<Teacher>();
    this.teacher.add(required);
    this.teacher.addAll(Arrays.asList(moreTeachers));
}

答案 1 :(得分:1)

您可以获得任意数量的教师,然后检查教师的数量是否至少为1:

private Set<Teacher> teachers;

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher... teachers) {
    super(TipoLugar.OTRO, nombre, planta, aforo);

    if (teachers.length == 0) {
        throw new IllegalArgumentException("No teachers given");
    }

    this.teachers = new HashSet<Teacher>();
    this.teachers.addAll(Arrays.asList(teachers));
}

如果需要两个构造函数,那么这是一种方法:

private Set<Teacher> teachers;

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher teacher) {
    this(nombre, planta, aforo, new Teacher[] { teacher });
}

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher[] teachers) {
    super(TipoLugar.OTRO, nombre, planta, aforo);

    if (teachers.length == 0) {
        throw new IllegalArgumentException("No teachers given");
    }

    this.teachers = new HashSet<Teacher>();
    this.teachers.addAll(Arrays.asList(teachers));
}

这对我来说似乎非常愚蠢,但第一个构造函数能够调用第二个构造函数是必要的。除此之外,它是第一个同样坚实的解决方案。

答案 2 :(得分:0)

你需要尝试构造函数重载..

public class Teacher
{
    public Teacher(string teacherName)
    {
        // Add single teacher
    }

    public Teacher(List<string> teacherNames)
    {
        // Add multiple teachers
    }
}

希望这有帮助

答案 3 :(得分:0)

我创建了两个构造函数,其中一个构建函数除了变量外,还接收一组教师作为List<Teacher> teachers,另一个只接收一个教师对象。

private Set<Teacher> teacher;

将单个Teacher对象添加到集合中。

 public DespachoImpl(String nombre, Integer planta, Integer aforo,Teacher teacher) {  
        super(TipoLugar.OTRO, nombre, planta, aforo);  
         this.teacher = new HashSet<Teacher>();  
         this.teacher.add(teacher);      
 }

将教师列表添加到集合中。

 public DespachoImpl(String nombre, Integer planta, Integer aforo,List<Teacher> teachers) {  
        super(TipoLugar.OTRO, nombre, planta, aforo);   
        this.teacher = new HashSet<Teacher>(teachers);  
 }

或者您可以将多个教师作为可变参数传递

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher... teachers) {
        super(TipoLugar.OTRO, nombre, planta, aforo);
        this.teachers = new HashSet<Teacher>();
        this.teachers.addAll(Arrays.asList(teachers));
    }

答案 4 :(得分:0)

正如所建议的那样,你应该使用构造函数重载。

Java知道要使用哪两个构造函数,因为它们的参数不同。所以你可以制作两个不同的构造函数,只要参数的类型或数量不同,就可以了。

在您的情况下,参数的数量是相同的,但最后一个参数的类型是不同的。对于一个构造函数,类型为Teacher,另一个为Set<Teacher>。因此,用Java编写它是合法的。

所以,例如:

private Set<Teacher> teacher;

// Constructor with only one teacher.

public DespachoImpl(String nombre, Integer planta, Integer aforo, Teacher teacher) {
    super(TipoLugar.OTRO, nombre, planta, aforo);
    this.teacher = new HashSet<Teacher>();
    this.teacher.add( teacher );
}

// Constructor with a set of teachers.

public DespachoImpl(String nombre, Integer planta, Integer aforo, Set<Teacher> teachers) {
    super(TipoLugar.OTRO, nombre, planta, aforo);
    this.teacher = new HashSet<Teacher>(teachers);
}

您实际上可以直接将teachers分配给this.teacher,但我选择显示复制,假设您可能需要使用您传递的参数作为其他内容的参数而且您不需要&# 39;不希望私人集受其影响。

现在,如果你打电话:

new DespachoImpl( "XXXX", 5, 8, new Teacher(....) );

它将调用第一个构造函数。但如果你打电话:

Set<Teacher> teachers = new HashSet<>();
teachers.add( new Teacher(...));
teachers.add( new Teacher(...));

new DespachoImpl( "XXXX", 5, 8, teachers );

它将调用第二个构造函数。