java

tnkciper  于 2021-07-12  发布在  Java
关注(0)|答案(0)|浏览(168)

在python中,可以生成如下所示的decorator函数。注意:我复制并粘贴了来自https://www.ritchieng.com/python/decorators-kwargs-args/

def printAllDecorator(func):
    def inner(*args,**kwargs):
        print ('Arguments for args: {}'.format(args))
        print ('Arguments for kwargs: {}'.format(kwargs))
        return func(*args,**kwargs)
    return inner

@printAllDecorator
def multiply(a, b):
    return a * b

>>> multiply(9,4)
Arguments for args: (9, 4)
Arguments for kwargs: {}
36

在 java 有这样的东西吗?现在,假设我有下面这样的东西。
java接口:

public interface MyInterface{
    String helloWorld();
}

实现该接口的类,我希望能够修饰该接口:

// package & imports...

public MyClassToDecorate implements MyInterface {
    @Override
    String helloWorld(){
        return "hello world!";
    }
}

现在,如果我想为它做一个装饰,我会去做另一个这样的类:

public MyDecorator implements MyInterface {
    private MyInterface myInterface;

    public MyDecorator(MyClassToDecorate myClassToDecorate){
        myInterface = myClassToDecorate;
    }

    @Override
    String helloWorld(){
        return "From the decorator: " + myClassToDecorate.helloWorld();
    }
}

这一切都很好。但是。。。我现在的情况是,我有10个不同的接口,每个接口都有20个或更多的函数,我想把这些函数中的每一个都 Package 在一个decorator中。而decorator对每一个都是完全相同的代码。
如果您想知道我这样做是为了什么:我有一个JavaSpring应用程序,我想模拟数据库故障。有10种不同的存储库接口。我想为每个存储库接口创建一个decorator类,每个存储库接口要求我重写至少20个函数。10个存储库*每个至少20个函数=至少200个函数,我必须一遍又一遍地为同一个修饰符编写这些函数。
在python中,我的解决方案是只编写一次decorator函数,如下所示:


# note: This isn't the exact logic I'm going to be using in my actual code.

# But this is a simple example to illustrate the kind of decorator I'm going for.

def someDecoratorFunction(func):
    def wrapper(*args,**kwargs):
        x = random.random()
        if x < .80:
            # forward request to actual repository 
            func(*args,**kwargs)
        else: 
            # simulate database access failure
            raise RuntimeError('Failed to open database')
    return wrapper

然后我将创建20个新的decorator类,每个类中的内容如下:

class ProxyEmployeeRepository(EmployeeRepositoryInterface):

    def __init__(self, realFileRepository):
        self.realFileRepository = realFileRepository

    @someDecoratorFunction
    def functionOne():
        return self.realFileRepository.functionOne()

    @someDecoratorFunction
    def functionTwo();
        return self.realFileRepository.functionTwo()

    # do the same thing for all of the other functions...

这不太乏味。。是的,我需要去做10个类,每个类至少有20个函数,但至少我可以用一个简单的 @decoratorFunctionName .
在java中有什么方法可以做到这一点吗?还是java spring?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题