在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?
暂无答案!
目前还没有任何答案,快来回答吧!