java8的Supplier
java8的Supplier
参考:
java.util.function.Supplier
定义
supplier也是是用来创建对象的,但是不同于传统的创建对象语法:new,每次调用get()
方法时都会调用构造方法创建一个新对象。
public class TestSupplier {
private int age;
TestSupplier(){
System.out.println(age);
}
public static void main(String[] args) {
//创建Supplier容器,声明为TestSupplier类型,此时并不会调用对象的构造方法,即不会创建对象
Supplier<TestSupplier> sup= TestSupplier::new;
System.out.println("--------");
//调用get()方法,此时会调用对象的构造方法,即获得到真正对象
sup.get();
//每次get都会调用构造方法,即获取的对象不同
sup.get();
}
}
输出结果:
--------
0
0
源码
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
案例
类似多例调用
@Bean
public Supplier<User> hbaseConnSupplier() {
return () -> {
User user = new User((int) (Math.random() * 1000));
System.out.println("调用了hbaseConnSupplier,User:id:" + user.getId());
return user;
};
}
controller调用
@Autowired
private Supplier<User> hbaseConnSupplier;
@RequestMapping("/test2")
public void test2(){
User user = hbaseConnSupplier.get();
System.out.println("test2:user:id:"+ user.getId());
System.out.println("test2:user:id2:"+ user.getId());
user=hbaseConnSupplier.get();
System.out.println("test2:user:id3:"+ user.getId());
System.out.println("----------------------");
}
输出
调用了hbaseConnSupplier,User:id:286
test2:user:id:286
test2:user:id2:286
调用了hbaseConnSupplier,User:id:13
test2:user:id3:13
----------------------
每次调用get方法都获取一个新的User