Function 对代码封装带来的改变

java 8 Function特性也出现了很久了,在项目用的越来越多,记录一下个人的感悟

 

1 函数式参数的编程思想,对callback功能的全面替代

    这个很容易理解,callback本身就是接近函数式参数的一个概念,代码封装中常会对同一个方法中相同的部分抽取,不同的部分定义成callback,调用者提供具体的实现,使用过的类HibernateDaoSupport是一个很好的体现,使用Function,Consumer可以做完美的替代,下面是我们针对幂等操作(分布式锁提供锁支持)的一个封装

 

 

    /**
     * 分布式锁支持,获取不到锁抛出IdempotentException
     * @param lockSuffix 锁前缀
     * @param paramSupplier 提供的参数bean
     * @param actionFunction 处理参数的函数
     * @param <T> 入参泛型
     * @param <R> 返回值泛型
     * @return
     * @throws IdempotentException
     */
    public <T,R> R idempotentAction(String lockSuffix, Supplier<T> paramSupplier, Function<T, R> actionFunction)
        throws IdempotentException {
        //加锁操作
        ZkMutex zkMutex = zkMutexClient.getDistributedLock(lockSuffix);
        logger.info("开始尝试获取锁!");
        boolean getLock = zkMutex != null ? zkMutex.acquire(5, TimeUnit.SECONDS, 3) : false;
        logger.info("获取锁结束!获取结果:{}", getLock);
        try {
            if (!getLock) {//未获取到锁
                logger.info("获取锁失败!稍后重试!");
                throw new IdempotentException("获取锁失败,稍后重试");
            }
            //逻辑块
            return actionFunction.apply(paramSupplier.get());
        } finally {
            if (getLock && zkMutex != null) {
                zkMutex.release();
                logger.info("zk分布式释放锁");
            }
        }
    }

   ps: ZkMutex是继承自curator框架的InterProcessMutex类,提供了异常的屏蔽

/**
 * zk锁,提供一层封装,保证zk锁在任何异常情况下不影响正常程序执行
 * Created by mxl on 2017/5/22.
 */
public class ZkMutex extends InterProcessMutex {

    private Logger logger = LoggerFactory.getLogger(ZkMutex.class);

    private CuratorFramework client;

    private String path;

    public ZkMutex(CuratorFramework client, String path) {
        super(client, path);
        this.client = client;
        this.path = path;
    }

    @Override
    public void acquire() throws Exception {
        try {
            super.acquire();
        } catch (Exception e) {
            logger.error("获取锁失败!", e);
        }
    }

    @Override
    public boolean acquire(long time, TimeUnit unit) {
        try {
            return super.acquire(time, unit);
        } catch (Exception e) {
            logger.error("获取zk锁异常!", e);
        }
        return false;
    }

    /**
     * 获取锁,支持重试
     * @param time
     * @param unit
     * @param tries
     * @return
     */
    public boolean acquire(long time, TimeUnit unit, int tries) {
        for (int i = 0; i < tries; i++) {
            try {
                if (super.acquire(time, unit)) {
                    return true;
                }
            } catch (Exception e) {
                logger.error("获取锁失败,重试次数:" + tries);
            }
        }
        return false;
    }

    @Override
    public void release() {
        try {
            super.release();
            deleteNode();
        } catch (Exception e) {
            logger.error("释放zk锁异常!", e);
        }
    }

    /**
     * 删除锁对于的节点
     */
    public void deleteNode() {
        try {
            List<String> children = this.client.getChildren().forPath(path);
            if (children == null || children.size() == 0) {
                this.client.delete().forPath(path);
            }
        } catch (Exception e) {
            logger.error("删除节点失败!", e);
        }
    }
}

 

2 泛型封装对泛型对象的实例化

 

    /**
     * 参数转换
     * @param inputParam
     * @param outputParam
     * @param <T>
     * @param <R>
     * @return
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     */
    private <T, R> R convertParam (Supplier<T> inputParam, Supplier<R> outputParam) throws IllegalAccessException,
            InvocationTargetException{
        T t = inputParam.get();
        R r = outputParam.get();
        if (t != null && r != null) {
            BeanUtils.copyProperties(r, t);
        }
        return r;
    }

 

 3 最常用的就是集合转换成stream对各种lambda表达式的支持,功能强大,省代码

 

### 关于嵌入式系统中代码封装的方法与最佳实践 #### 封装的重要性 在嵌入式系统开发过程中,良好的代码封装不仅有助于提高代码的可维护性和重用性,还能增强模块间的独立性,降低耦合度。这使得开发者能够更专注于各个功能模块的设计和实现。 #### 设计原则 遵循面向对象编程(OOP)的原则可以有效促进代码的有效封装: - **单一职责原则(SRP)**:确保每个类只负责一项功能或行为[^1]。 - **开放封闭原则(OC)**:软件实体应该对扩展开放,对修改关闭。这意味着可以通过增加新代码改变现有功能而不必改动原有代码。 #### 实现方法 ##### 使用C/C++语言特性 利用静态函数(static function),私有成员(private member),以及命名空间(namespace)等机制隐藏内部细节并暴露必要的公共接口给外部调用者。 对于较大的项目来说,还可以考虑采用组件化(Component-based)的方式组织源文件,即按照不同的业务逻辑划分成多个相对独立的小型库(library)[^2]。 ```cpp // example.h #ifndef EXAMPLE_H_ #define EXAMPLE_H_ class Example { public: void PublicMethod(); // 可被外界访问的方法 private: static int PrivateStaticVar; // 私有的静态变量 void PrivateMethod(); // 不允许外部直接调用的方法 }; #endif /* EXAMPLE_H_ */ ``` ##### 接口定义清晰明确 为每一个重要的功能单元提供简洁明了的应用程序接口(APIs), 这样即使底层的具体实现在未来发生变化也不会影响到上层应用程序正常使用该服务[^3]。 例如,在设计驱动程序时,应当将具体的硬件操作抽象出来形成统一的标准API供其他部分使用;而在编写网络协议栈的时候,则需对外部呈现一致的数据传输方式而不管内部是如何工作的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值