在Java中模拟Python的装饰器

业务:
给表中的数据打不同的标签 如品牌标签 产品标签 情感标签等

打标签的逻辑

log.info("{} Start tagging {}",table,label)
// 具体打标签的逻辑
log.info("{} End tagging {}",table,label)

除了具体的打标签的逻辑外 日志信息是可以共用的

如果用Python来操作就很简单 定义一个装饰器即可 如下所示

def log(func):
    def wrapper(*args):
        print('{} -- Start tagging {}'.format(*args))
        result = func(*args)
        print('{} -- End tagging {}'.format(*args))
        return result

    return wrapper

@log
def tagging_A(table,lable):
  # 不关心日志 只有具体的业务逻辑
  print("do something here")
@log
def tagging_B(table,lable):
  print("do something here")

当调用tagging_A或tagging_B的时候 会自动加上日志

但是Java没有像Python这么好用的装饰器 所以决定采用模板模式 如下所示

    // 模板
    private void taggingTemplate(String table,String label,Runnable action){
        log.info("{} -- Start tagging {}",table,label);
        action.run(); // 具体的打标签逻辑
        log.info("{} -- End tagging {}",table,label);
    }
    
    public void taggingA(){
        taggingTemplate("table_a","label_A",()->{
            // 具体的打标签逻辑放在这里
            System.out.println("do something here");
        });
    }
    

除了模板模式外 不知道还有没其他轻量级的方式可以在Java中模拟Python的装饰器?

阅读 2.7k
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏