我写了一个程序如下:
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()应该返回一个值。
请帮助理解这一点。
答案 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 == stu
为false
的原因是因为您要比较Supplier
并发出Student
和Student
对象本身,它们是不同的类,当然不是同一个类的实例。
stu.getId()
为空的原因是因为每次您在供应商处调用get()
方法时,它都会创建一个新的Student
,Student
您设置的ID为{ ,永远不会再次使用,最终将被垃圾收集
您刚刚创建了打印id的学生。