将CopyData接口改为函数式接口是否可行?如何省去实现类直接使用?
方案可行性与实现步骤
可行性结论
完全可行。因为CopyData接口仅包含一个抽象方法<T extends SpecificRecordBase> void copy(T data),满足函数式接口的核心要求,添加@FunctionalInterface注解后,可直接通过Lambda表达式替代专门的实现类,无需额外编写CopyDataImpl。
具体实现步骤
1. 改造CopyData接口,添加函数式接口注解
@FunctionalInterface public interface CopyData { <T extends SpecificRecordBase> void copy(T data); }
注:@FunctionalInterface注解是可选的,但添加后编译器会强制校验接口是否符合函数式接口规范,避免后续误加抽象方法破坏结构。
2. 修改Spring配置类,用Lambda表达式直接实现CopyData Bean
将原CopyDataImpl中的业务逻辑内联到配置类的Bean定义中,依赖CopyDataProvider的方式保持不变:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CopyDataDynamicConfig { // 声明日志对象,替代原实现类中的log private static final Logger log = LoggerFactory.getLogger(CopyDataDynamicConfig.class); @Bean public CopyDataProvider copyDataProvider() { return new CopyDataProviderImpl(); } @Bean public CopyData copyData(CopyDataProvider copyDataProvider) { // 用Lambda表达式实现CopyData的copy方法逻辑 return data -> { try { Copier copier = copyDataProvider.copyFor(data); if(copier == null) { return; } ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); Encoder encoder = EncoderFactory.get().jsonEncoder(data.getSchema(), byteStream); data.customEncode(encoder); encoder.flush(); copier.copy(data); } catch (Exception e) { log.error("Error occurred storing the data {}", e.getMessage()); } }; } }
3. 验证与使用
后续业务代码中注入CopyData Bean的方式完全不变,依然可以正常调用copy()方法,功能与原实现完全一致。
内容的提问来源于stack exchange,提问作者SRJ
相关产品推荐
相关产品推荐

