我们有
class Student
{
String name,
int age,
String specialization
}
和
class Students
{
List<String> names,
List<Integer> age,
List<String> specialization
}
学生对象基本上是一个包含学生班级字段值的结构
在不使用反射的情况下填充Students对象的最佳方法是什么。
编辑:我们有一个特定的要求让学生上课原样,原因是我们不总是想要学生班的所有信息,如果我们有列表,它会为那些字段分配内存我们对此不感兴趣。
答案 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();