我想编写一个方法来接收来自调用者的代码以从实例中提取信息。该方法将从几个地方调用,因此将其模块化并这样编写是有意义的:
private int doSomething(Function<ThisClass, int> getterForInt) {
int[] exprStart = { -1 };
SomeClass sc = new SomeClass() {
@Override
protected void doInternal() {
// Here I have access to protected stuff of SomeClass:
exprStart[0] = this.start;
// This allows the lambda to access only public stuff of SomeClass:
exprStart[0] = getterForInt.apply(this);
}
};
// do stuff with sc
:
return exprStart[0];
}
注意
SomeClass
是第三方类,所以我不能简单修改它。
如上所述,存在一些访问限制,因此这会导致编译器错误,因为
start
是 protected
:
doSomething(sc -> sc.start);
有没有办法允许将代码传递到
doSomething()
,以便可以从SomeClass
访问受保护的内容,或者我真的必须在每次使用时复制/粘贴doSomething()
吗?我的意思是我可能可以使用反射并修改可读性(在本例中为 start
),但这并不直观。
问题不在
doSomething
内部,而是在调用doSomething
的方法内部。如果该方法实际上是 SomeClass
子类的成员,那么您将能够在 lambda 中访问 start
。作为一种黑客,您可以创建一个带有初始化程序的匿名子类,该子类将立即执行:
private void myMethod() {
new SomeClass() {
{
doSomething(sc -> sc.start);
}
};
}