我们都知道在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
,并且在方法体内我想要确定它是静态调用还是非静态调用。上述问题将有助于我评估这样做的可行性。
答案 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"
看起来这会简单得多。