【问题标题】:Invoking a method of an anonymous class without reflection in java在java中调用匿名类的方法而不进行反射
【发布时间】:2017-11-17 13:13:18
【问题描述】:

我想做这样的事情

static <T> T mine()
{
    return  new Object(){void hello(){}};
}

这样我就可以做到了

mine().hello();

打算做这样的事情

mine.hello().hi().bye();

所以要么我用 1 个方法 hello,hi,bye 声明每个类,然后返回实例,或者以某种方式我可以从上面的每个方法中返回一个匿名类(使用新定义的方法)。这样我就不必写很多课程了。

喜欢我可以的

static <T> T tunnel(T t)
    {
        return t;
    }

tunnel(new Object()
        {
            void hello()
            {
                System.out.println("hello");

            }
        }).hello();

但它没有用,我想从隧道返回匿名对象(在隧道本身中创建),而不是返回传递的参数

【问题讨论】:

  • 我认为您正在寻找的是构建器模式:en.wikipedia.org/wiki/Builder_pattern#Java
  • 不,我喜欢看一些 BDD 类型的代码,比如 Mockito.doReturn(...).when(...) 但问题是我只想有一种方法,即你好() 在 mine() 的返回时被调用,只有 hi() 在 hello() 的返回时被调用,所以这意味着我必须声明多个类并返回它们的实例。如果可能的话,这就是我想避免使用匿名类的原因
  • 那么匿名类是不可能的,因为它们就是匿名类。

标签: java bdd dsl anonymous-inner-class


【解决方案1】:

您可能想要一门流利的课程。类似的东西

public class MyFluentClass {

   public MyFluentClass methodOne() {
     // do something
     return this;
   }

   public MyFluentClass methodTwo() {
     // do something
     return this;
   }
}

然后在你的主要方法中:

MyFluentClass myFuent = new MyFluentClass();
myFluent.methodOne().methodTwo();   

【讨论】:

  • 通过您的方法,它可以部分满足要求,但缺陷是 API 用户也可能以这种方式触发方法链 myFluent.methodTwo()..methodOne() 但这是不允许的,因此我有比创建只有 methodTwo() 的另一个类,然后从 MyFluentClass 的 methodOne() 返回该类的实例
  • 在这种情况下,您可以查看 step-builder-pattern:rdafbn.blogspot.nl/2012/07/step-builder-pattern_28.html
  • 虽然不是我想要的,但仍然以某种方式解决了我的问题。谢谢@Ronald
猜你喜欢
  • 2011-02-09
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多