当前位置:  开发笔记 > 编程语言 > 正文

访问匿名类的构造函数

如何解决《访问匿名类的构造函数》经验,为你挑选了4个好方法。

假设我有一个具体的类Class1,我正在创建一个匿名类.

Object a = new Class1(){
        void someNewMethod(){
        }
      };

现在有什么方法可以重载这个匿名类的构造函数.如下图所示

Object a = new Class1(){
        void someNewMethod(){
        }
        public XXXXXXXX(int a){
          super();
          System.out.println(a);
        }
      };

用xxxxxxxx命名构造函数?



1> Jon Skeet..:

从Java语言规范,第15.9.5.1节:

匿名类不能具有显式声明的构造函数.

对不起:(

编辑:作为替代方案,您可以创建一些最终的局部变量,和/或在匿名类中包含实例初始化程序.例如:

public class Test {
    public static void main(String[] args) throws Exception {
        final int fakeConstructorArg = 10;

        Object a = new Object() {
            {
                System.out.println("arg = " + fakeConstructorArg);
            }
        };
    }
}

这很糟糕,但它可能只对你有所帮助.或者,使用适当的嵌套类:)


OMG,有人指责THE Jon Skeet复制吗?
阿恩,我相信他没有复制它.他知道足够的java足够公平,当他想复制它时我会给予信任.

2> Arne Burmeis..:

这是不可能的,但你可以像这样添加一个匿名的初始化器:

final int anInt = ...;
Object a = new Class1()
{
  {
    System.out.println(anInt);
  }

  void someNewMethod() {
  }
};

不要忘记最后对匿名类使用的局部变量或参数的声明,就像我为anInt所做的那样.



3> Joel Shemtov..:

这是解决问题的另一种方法:

public class Test{

    public static final void main(String...args){

        new Thread(){

            private String message = null;

            Thread initialise(String message){

                this.message = message;
                return this;
            }

            public void run(){
                System.out.println(message);
            }
        }.initialise(args[0]).start();
    }
}


很好的解决方案,但是在这里使用Thread会让它在一开始有点误导(有一段时间我认为你创建了一个单独的线程来初始化东西!)
请注意,在定义`t`之后,除非在类/接口类型中定义了此函数,否则不能调用`t.initialise()`.

4> Thirumalai P..:

我知道这个帖子太旧了,无法发布答案.但我仍然认为这是值得的.

虽然你不能有一个显式的构造函数,但如果你打算调用超类的构造函数,那么你需要做的就是以下内容.

StoredProcedure sp = new StoredProcedure(datasource, spName) {
    {// init code if there are any}
};

这是StoredProcedure通过传递a DataSource和对象在Spring 中创建对象的示例String.

所以底线是,如果你想创建一个匿名类并想要调用超类构造函数,那么创建一个带有与超类构造函数匹配的签名的匿名类.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有