一次调用一个对象,并在不同的实例中分配不同的输入参数



在Java中,

假设我有一个名为"Module"的对象类另一个名为"Student"的类接受"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);
}
}

我如何才能只创建一个学生和一个模块,但为各自的个人分配不同的输入参数。

如何只调用一个学生和一个对象,但为各自的分配不同的输入参数

它完全取决于Student(可能还有Module)的实现。从根本上讲:您通常通过setter将其属性设置为新值—如果他们提供的话。

例如,假设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就可以很高兴地保留你传递的实例。不过,在更新s实例时,你仍然需要创建一个新的Module

我并不是说重用s实例是个好主意。JVM非常擅长垃圾收集,尤其擅长在一个方法中对在该方法中创建的对象的引用无法在方法终止后幸存下来时(这很重要;例如,如果该方法使用了lot)对其进行优化。

相反,我只会做一件简单的事情(你的问题中有什么),如果该代码被证明是内存压力问题的来源,看看为什么是,然后,当你有了这些信息时,处理它。

例如:不要过早地进行微优化。:-)

最新更新