从对象创建值的映射

时间:2017-03-20 06:36:13

标签: java

我们有

class Student
{
    String name,
    int age, 
    String specialization 
}

class Students
{
    List<String> names,
    List<Integer> age, 
    List<String> specialization
}

学生对象基本上是一个包含学生班级字段值的结构

在不使用反射的情况下填充Students对象的最佳方法是什么。

编辑:我们有一个特定的要求让学生上课原样,原因是我们不总是想要学生班的所有信息,如果我们有列表,它会为那些字段分配内存我们对此不感兴趣。

5 个答案:

答案 0 :(得分:3)

我不建议为此目的创建一个名为“Students”的类。您的目的是创建一个集合来保存Student对象。

在这种情况下,请执行以下操作:

List<Student> students = new ArrayList();

另外,请注意大写:是一个关键字,应拼写为全部小写。

编辑看到venkat的评论后: 如果你真的需要创建一个名为学生的课程,那么以下工作应该有效(也是上面另一个SO用户提供的类似答案):

class Students {
    List<Student> students = new ArrayList();
}

这应该可行,但我强烈建议不要使用复数名称的这类类!

PS:我是一名CS教授,在一所大学教授编程语言,并且是一名长期的开发人员/顾问。

答案 1 :(得分:2)

不要创建课程Students。保留Student

列表
List<Student> students = new ArrayList<Student>();

要访问学生数据,您可以使用

students.get(0).name;

作为旁注,您应该了解getters and setters

答案 2 :(得分:1)

Class Students {    
   List<Student> students;
}

答案 3 :(得分:0)

在这里寻找明显的答案。

class Students
{
    List<String> names;
    List<Integer> age;
    List<String> specialization;

    public Student(List<Student> students) {
        addStudents(students);
    }


    private void addStudents(List<Student> students) {
        names = students.stream
                        .map(Student::getName)
                        .collect(Collectors.toList())
        age = students.stream
                      .map(Student::getAge)
                      .collect(Collectors.toList())
        specialization = students.stream
                                 .map(Student::getSpecialization)
                                 .collect(Collectors.toList())
   }
}

答案 4 :(得分:0)

也许你想使用装饰器模式(我不认为我节省了内存):

使用默认字段实现基类:

public class BaseClass implements INameGettable {

    protected String name;

    public BaseClass(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

添加默认界面:

public interface INameGettable {
    String getName();
}

为其他字段添加装饰器,例如年龄:

public class Decorator implements INameGettable {

    protected INameGettable nameable;
    protected int age;

    public Decorator(INameGettable nameable, int age) {
        this.nameable = nameable;
        this.age = age;
    }

    public String getName() {
        return nameable.getName();
    }

    public int getAge() {
        return this.age;
    }
}  

用法:

// First object contains only name
INameable namegettable = new BaseClass("Test1");
namegettable.getName();

// Second object contains name and age
Decorator agegettable = new Decorator(new BaseClass("Test2"), 77);
agegettable.getName();
agegettable.getAge();