java供应商价值无法修改?

时间:2017-02-17 05:02:37

标签: java

我写了一个程序如下:

public class Testing {

    Student student;
    public static void main(String[] args) {
        Supplier<Student> myStudent = Student::new;
        Student stu = new Testing().computeRequiredValue(myStudent).get();

        System.out.println(myStudent == stu);

        System.out.println(stu.getId());
    }

    public Supplier<Student> computeRequiredValue(Supplier<Student> valueToBePopulated) {
        Optional<Student> studentOptional = Optional.ofNullable(valueToBePopulated.get());

        if (studentOptional.isPresent()) {
            student = valueToBePopulated.get();
            student.setId("22");
            student.setName("Dbanga Srinu");
        }

        return valueToBePopulated;

    }

}

我看到System.out.println的输出(myStudent == stu);

    System.out.println(stu.getId());

是false并且为null。我假设myStudent和stu引用同一个对象,在堆上,它们应该被修改,条件myStudent == stu应该返回一个true,stu.getId()应该返回一个值。

请帮助理解这一点。

3 个答案:

答案 0 :(得分:3)

Supplier<Student>不是引用和任何特定Student,而是提供Student的函数。

这意味着myStudent == stu永远不会相同,因为它们的类型不同。

由于Supplier<Student>不是一项功能,您实际上是在调用.get()共3次,创建多个不同的Students,一个在您的字段中,一个在本地变量

尝试将computeRequiredValue功能更改为只调用供应商一次,然后返回Optional学生。

public class Testing {

    static Student student; // changed this to be static so I can reference it in main
    public static void main(String[] args) {
        Supplier<Student> myStudent = Student::new;
        Student stu = new Testing().computeRequiredValue(myStudent).get();

        System.out.println(student == stu); // using the same types, this can now be true, assuming they are in fact the same instance

        System.out.println(stu.getId()); // prints 22
        System.out.println(student.getId()); // prints 22
    }

    public Optional<Student> computeRequiredValue(Supplier<Student> valueToBePopulated) {
        Optional<Student> studentOptional = Optional.ofNullable(valueToBePopulated.get());

        if (studentOptional.isPresent()) {
            student = studentOptional.get(); // get the optional, not calling the supplier again.
            student.setId("22");
            student.setName("Dbanga Srinu");
        }

        return studentOptional; // returns the optional
    }
}

答案 1 :(得分:1)

下面:

Supplier<Student> myStudent = Student::new;
Student stu = new Testing().computeRequiredValue(myStudent).get();

换句话说:

myStudent = new X();
stu = myStudent().get();

那些相同的对象;所以==永远不可能是真的。 哎呀,那些东西甚至都不是相同的类。你试图比较苹果和苹果树 - 它怎么可能是相同的?!

除此之外:供应商 提供 new学生对象......但我想你现在已经明白了这一点。

答案 2 :(得分:1)

myStudent == stufalse的原因是因为您要比较Supplier并发出StudentStudent对象本身,它们是不同的类,当然不是同一个类的实例。

stu.getId()为空的原因是因为每次您在供应商处调用get()方法时,它都会创建一个新的StudentStudent您设置的ID为{ ,永远不会再次使用,最终将被垃圾收集 您刚刚创建了打印id的学生。