调用对象一次,并在不同的情况下
问题描述:
在Java分配不同的输入参数,调用对象一次,并在不同的情况下
假设我有一个名为对象类“模块” 和另一个名为“学生”类可以接受的“模块” 如何输入参数我可以创建一个对象一次但当时只是每次给它分配不同的值(以效率和节约内存的利息)
这是在哪里创建我的低效的代码示例多个对象
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);
}
}
如何创建只有1个学生,只有1个模块,但为他们分配不同的输入参数为各自的个人。
答
我怎么能说只有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
可以愉快地让你通过它的实例。不过,在更新s
实例时,您仍然需要创建一个新的Module
。
我不是说重复使用s
实例是一个好主意。 JVM非常擅长垃圾收集,尤其擅长在方法中对引用创建的对象的引用进行优化,但不会在方法终止后生效(例如,如果使用方法lot )。
相反,我只想做简单的事(你在你的问题有)和如果代码原来是一个内存压力问题的根源,看看这是为什么然后,当你有这些信息,并处理它。
例如:不要过早微观优化。 :-)
你的代码几乎没有效率...... 如果有多个学生,则有多个Student类的实例是有意义的。如果您想更改学生的信息,只需更新Student实例内的变量即可。 – explv
*“我怎样才能调用一个对象......”*你不“叫”对象。你什么意思?创建? –
你试图保存多少纳秒? :D –