【问题标题】:Variable changed after initialization not reflected in interface初始化后更改的变量未反映在界面中
【发布时间】: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 两次,第二次做了一些与我想要的不同的事情。

标签: java android interface


【解决方案1】:

问题是在父类中,我多次调用 someFoo.setFoo,将 foo 设置为不同的 MyInterfaces。我解决了这个问题,它工作得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2016-10-25
    相关资源
    最近更新 更多