我在https://dzone.com/articles/supplier-interface上看到了一些使用供应商界面的例子.
我的问题是,如果在上面的例子中,我可以做一些简单的事情:
driveVehicle(new Vehicle()); driveVehicle(new Car());
为什么要使用供应商界面,如果它只是调用方法,而不接受任何参数.
假设您在数据库中存储了要在整个应用程序中保持不变的参数
// Assume retrieveSystemParameter query database which allows to change parameters public static String SYSTEM_PARAMETER = StaticUtilities.retrieveSystemParameter();
该值将初始化一次,并且不会更改,直到重新部署.话虽如此,如果您使用供应商:
public static SupplierSYSTEM_PARAMETER_SUPPLIER = StaticUtilities::retrieveSystemParameter;
当您需要某个值时,您将调用SYSTEM_PARAMETER_SUPPLIER.get()
哪个值将在需要时检索数据库中的参数 - 这样,如果更改数据库中的参数,则无需重新部署.
如您所见,供应商很懒惰.当你要求他们工作时(通过调用.get()),他们会完成工作 - 如果你明智地处理它们,这可能会让你获得一些性能提升.有时您会调用一个方法,该方法期望X
传递方法的变量retrieveX
,然后最终不需要X
在方法中,因为某些条件不满足.在这种情况下,您将失去性能,因为您将执行要检索的代码,X
而检索的供应商X
只会在调用时执行它,.get
并且只有满足条件才会执行该调用.
免责声明:系统参数常量只是我想到的第一个例子,但考虑到它在每个.get()上查询数据库,你宁可缓存参数并在特定的时间间隔内调用缓存.get().
我猜可选可能是完美的例子.请考虑以下代码段:
final Product firstProduct = Optional.ofNullable(product) .orElse(productDao.findProductById(id)); final Product secondProduct = Optional.ofNullable(product) .orElseGet(() -> productDao.findProductById(id));
您获得的产品可能为空.为了确定firstProduct,java必须在orElse方法中调用表达式,因此无论产品是否为null,您始终必须确定在产品为null的情况下将返回的值.
为了确定secondProduct数据库,如果产品不为null,则不必查询,因为您传递的是仅当product为null时才会调用的Supplier.