【发布时间】:2016-11-26 03:55:57
【问题描述】:
抱歉标题不好。反正我实在想不出这个有趣的问题。
我有一个相当大的课程,在那个课程中我有一个接口(我们称之为 foo)。
foo 在类完成初始化后由用户设置。 (即 someClass.setFoo(randomInterface)。
出于这个原因,我在类的顶部有一些预制接口,用户将为特定实例选择一个。让我们使用上面的例子。
在我的 someClass.setFoo 我会有这样的东西
public final void setFoo(MyInterface interface){
foo = interface;
}
MyInterface 接口中会有一个调用,比如 executeFoo。
interface MyInterface{
void executeFoo();
}
终于有了我的 randomFoo 接口。
MyInterface randomFoo = new MyInterface(){
@Override
void executeFoo(){
Log.d("Some Stuff here?","Maybe?");
}
}
我的问题是当我稍后调用 MyInterface.executeFoo() 方法时(在用户正确设置接口之后,假设他们有),我从来没有看到这个日志弹出窗口。
我一辈子都想不通为什么,我什至清理了构建(android studio),卸载它并重新开始,但仍然一无所获。
如果 i 在初始化之前绕过 set 并仅将 foo 设置为 randomFoo,它就可以正常工作。
所以我想我对为什么这不起作用感到困惑,如果我只是误解了一些关于 java 的东西。
以下是我正在使用的课程的简要概述(使用上述示例)。
在我的父类中,假设有一个这样的调用
// ... other parent stuff
SomeClass someClass = new SomeClass();
someClass.setFoo(SomeClass.randomFoo);
someClass.executeFoo();
// ... some random parent stuff after
一些类
public class SomeClass{
public final static MyInterface randomFoo = new MyInterface(){
@Override
public void executeFoo(){
Log.d("Some Stuff here?","Maybe?");
}
};
public final static MyInterface randomFoo1 = new MyInterface(){
@Override
public void executeFoo(){
Log.d("RandomFoo1","RandomFoo1");
}
};
private MyInterface foo;
public SomeClass(){
init();
}
private final void init(){
// This does nothing of relevance here
}
public final void setFoo(MyInterface newFoo){
foo = newFoo;
}
public final void executeFoo(){
foo.executeFoo();
}
interface MyInterface{
void executeFoo();
}
}
【问题讨论】:
-
请张贴minimal reproducible example 显示确切的问题。 (同样
interface是保留字) -
If i by pass the set and just set foo to be randomFoo before the initialization到底是什么意思?无论您展示什么,都可以按预期工作。不熟悉 Android -Log部分设置正确吗? -
randomFoo不是static。它应该由someClass.randomFoo而不是SomeClass.randomFoo访问。否则我在这里看不到任何问题。具体是什么问题? -
我只是将这段代码作为一个普通的 java 程序执行(将 Log.d() 更改为 sysout),它工作正常,因为我很确定 Log.d() 工作正常。你能分享一下究竟是什么导致日志不能在 logcat 中打印吗?
-
我的愚蠢。我昨晚深夜浏览了代码,发现我设置了 someClass.setFoo 两次,第二次做了一些与我想要的不同的事情。