有没有办法将调用我的静态方法的对象作为实例方法?

时间:2015-05-14 17:05:44

标签: java static

我们都知道在Java中你可以将静态方法称为实例方法,如下所示:

Foo foo = new Foo();
FooBar fooBar = foo.bar(); // bar is a static method on class Foo

我想知道的是:

  • 有没有办法在bar内确定bar是静态调用(Foo.bar())还是通过上面的类实例调用?
  • 如果是这样,bar是否有办法获得对调用它的对象的引用(在本例中为foo)?

原因:

我正在开发一种语义语法。我希望我的消费者能够做出类似的事情:

With.attribute("blah").and().attribute("blahblah"); // both "attribute" and "and" methods return an object of type "With"

在这里,您可以看到attribute被称为静态和实例方法。但是,您无法在Java中定义具有相同名称的静态和实例方法,原因与上述相同 - 静态方法可以作为实例方法调用,因此可以创建具有相同名称的实例方法会造成歧义。因此,我想创建一个可以静态和非静态调用的方法attribute,并且在方法体内我想要确定它是静态调用还是非静态调用。上述问题将有助于我评估这样做的可行性。

2 个答案:

答案 0 :(得分:2)

不,该方法无法知道它是在类上还是在实例上调用(在JVM级别上没有区别),并且无法获取该方法被调用的实例上。

这种“语义语法”的术语是domain-specific language(DSL)。

可能的解决方案:命名静态方法withAttribute,然后你可以看起来像这样:

withAttribute("blah").and().attribute("blahblah");

答案 1 :(得分:-1)

Java并不是为了做到这一点,因为这不是一件好事。

如果你想做这样的事情,为什么不做像

这样的事情
new foo().withAttribute("blah").withAttribute("blahblah");

这样做真的不是一个好主意。
另外,为什么让消费者使用java代码来提供说明?为什么不做像

这样的事情
make a foo //Check for and chop off "make a" to get the object to create
add attribute blah //Check for and chop off "add attribute" to get the attribute to add
add attribute blahblah //Or, if you can add other things too, check for and chop off "add", then check for and chop off "attribute"

看起来这会简单得多。