2015-05-14 36 views
1

我们都知道,在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

如果您静态调用它,则无法获取对象。你可以实现这种类型的方法,但是如果你使用该对象并将它作为一个值返回,那么你可以做.and(),并且还可以做更多的.attribute –

+2

你可以提供一个静态'with()'方法来返回一个新的实例。 –

回答

2

没有,也没有办法为方法,以了解其是否被称为一个类或一个实例(JVM级别没有区别),有没有办法让该实例的方法是拜访。

对于这种“语义语法”的期限为domain-specific language(DSL)。

可能的解决方法:命名静态方法withAttribute,那么你可以使它看起来像这样:

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

他们所做的被称为“流利的api”而不是“DSL”,两者完全不同。 –

+0

@JarrodRoberson这是[内部DSL](http://martinfowler.com/books/dsl.html)的一个很好的例子。流畅的API可以被看作是一个小型的DSL。 – Jesper

+0

尽可能的解决方案,尽管这个类被称为“With”,而这个语义会让我们感到困惑。我可以调用类'W',并把'W.ithAttribute(“blah”)和()。属性(“blahblah”);' - 得爱Java .... – Kidburla

-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" 

看来这样会简单得多。

+0

你为什么说这不是一个好主意?特定于领域的语言非常流行,这是一种在几个众所周知的框架中使用的技术。例如JPA标准API。你有没有什么好的理由可以说这不好,除了你不熟悉它或个人喜好? – Jesper

+1

我的意思是,而不是说新的foo().bar(),你应该做foo.bar()。 从实例中调用静态方法并不是很好。 –

+0

我同意在一个实例上调用静态方法通常不是一件好事。 – Jesper

相关问题