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

时间:2017-10-11 14:22:37

标签: java object

在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);
    }

}

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

1 个答案:

答案 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非常擅长垃圾收集,并且特别擅长在方法中优化它,因为在该方法中创建的对象的引用不能在方法终止时存在(重要的是它;例如,如果方法使用很多)。

相反,我会做直截了当的事(你在问题中有什么)和如果那个代码被证明是内存压力问题的根源,看看为什么那是然后,当你掌握了这些信息并处理它时。

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