Java - 如何动态创建“匿名”类

Dav*_* T. 5 java oop anonymous-class

我可以做这个:

new Object(){
    public void hi(){}
}.hi();
Run Code Online (Sandbox Code Playgroud)

我该如何(或我可以)做到这一点:

IWouldRatherStayAnonymous t = new IWouldRatherStayAnonymous extends Thread(){
    public void NoNoYouCantCallMe(String s){}
};
t.NoNoYouCantCallMe("some useful data that i will need later, but don't want to save this anonymous class");
Run Code Online (Sandbox Code Playgroud)

如果我不能在语法上做到这一点,任何人都可以解释为什么这永远不会起作用的逻辑/实现设计吗?

===========================================

编辑:澄清 - 我想创建一个匿名类而不保存它,然后实例化该匿名类的实例。我只需要 1 个引用,因为我不打算经常使用这个引用(即使在同一个外部类中我也不希望其他任何东西使用它)。但是,我只想将一些数据传递给这个匿名类一次(最好是构造函数,但您会注意到实际上无法重写 Thread() 中的构造函数)。

这确实不是什么大不了的事,我只是好奇这是否可行,但从一些答案来看,它似乎是可行的,但只是不太漂亮。

Pau*_*ora 5

您的问题有点令人困惑,但听起来您想要一个既扩展Thread又实现某个接口的类,但在它所使用的方法之外无法访问该类(这甚至会排除私有嵌套类)。在这种情况下使用本地类

void myMethod() {
    class Impl extends Thread implements SomeInterface {
        @Override
        public void someInterfaceMethod(String s){ }
    }
    new Impl().someInterfaceMethod("data");
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了响应您的更新,您自然可以为本地类提供一个构造函数并传入数据,或者只是让它关闭final外部方法中的变量。


das*_*ght 1

访问匿名类的方法有两种方式:

  • 通过实现接口或扩展类,然后调用您在匿名类中实现的方法,或者
  • 通过使用反射(我假设您知道它是如何完成的,但不想这样做)。

Java没有提供静态捕获匿名类类型的方法,例如以类似于C#关键字的方式var

在您的情况下,您可以使用该方法创建一个抽象类型void NoNoYouCantCallMe(String),并使用该类作为匿名类的基础,如下所示:

abstract class MyThreadBase extends Thread {
    public abstract void YesICanCallYou(String s);
}
...
MyThreadBase t = new MyThreadBase() {
    public void YesICanCallYou(String s){}
};
...
t.YesICanCallYou();
Run Code Online (Sandbox Code Playgroud)