在Java中,
假设我有一个名为' Module'的对象类。 还有另一个叫做“学生”的课程。接受'模块'的输入参数 如何创建一个一次的对象,但每次只为其分配不同的值(为了提高效率和保存内存)
以下是我创建多个对象的低效代码示例
public class StudentTest {
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Student s1 = new Student ("Joe", "Bloggs", 19, new Module("com1028", "come1028", 70, 120) );
Student s2 = new Student("Stella", "Kazamia", 24, new Module("com1026", "come1032", 40, 60) );
System.out.println(s1);
System.out.println(s2);
}
}
如何只创建一个学生,只创建一个模块,但为各个人分配不同的输入参数。
答案 0 :(得分:0)
如何只调用1名学生,只调用1个对象,但为各个人分配不同的输入参数
完全取决于Student
(可能Module
)的实施。从根本上说:您可以将属性设置为新值,通常是通过设置者 - 如果他们提供的话。
例如,假设Student
看起来像这样:
public class Student {
private String firstName;
private String lastName;
private int age;
private Module module;
public Student(String firstName, String lastName, int age, Module module) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.module = new Module(module); // Defensive copy
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return this.firstName;
}
// ...and so on for lastName and age...
public void setModule(Module module) {
this.module = new Module(module); // Defensive copy
}
public Module getModule() {
return new Module(this.module); // Defensive copy
}
}
请注意防御性副本,因为您已经说过Module
提供了setter(因此Student
使用您提供的实例是没有意义的。)
在这种情况下,您可以避免创建第二个Student
,如下所示:
Student s = new Student ("Joe", "Bloggs", 19, new Module("com1028", "come1028", 70, 120) );
System.out.println(s);
s.setFirstName("Stella");
s.setLastName("Kazamia");
s.setAge(24);
s.setModule(new Module("com1026", "come1032", 40, 60));
System.out.println(s);
...但你仍然需要创建一个新的Module
来传递给setter(并且setter会创建一个要保留的副本)。
如果您想避免使用防御性副本,则需要Module
不可变,以便Student
能够愉快地保留您传递它的实例。但是,在更新Module
实例时,您仍需要创建新的s
。
我不是说重用s
实例是个好主意。 JVM非常擅长垃圾收集,并且特别擅长在方法中优化它,因为在该方法中创建的对象的引用不能在方法终止时存在(重要的是它;例如,如果方法使用很多强>)。
相反,我会做直截了当的事(你在问题中有什么)和如果那个代码被证明是内存压力问题的根源,看看为什么那是然后,当你掌握了这些信息并处理它时。
例如:不要过早地进行微量优化。 : - )