Java Tapestry中的静态、非静态和独立类之间的调用

Java Tapestry中的静态、非静态和独立类之间的调用,java,static,tapestry,non-static,Java,Static,Tapestry,Non Static,在我的Java Tapestry应用程序中,我有一个名为nachrichtenuble.Java的类,它测试是否有任何消息要宣布,以及是否应该显示特定的元素。看起来是这样的: public boolean ShowBubble() { int n = getHowManyNachrichten(); if (n == 0) { return false; } return true; } 现在,在我的应用程序中的另一个地方,我想根据有多少条消息来

在我的Java Tapestry应用程序中,我有一个名为nachrichtenuble.Java的类,它测试是否有任何消息要宣布,以及是否应该显示特定的元素。看起来是这样的:

public boolean ShowBubble() {
    int n = getHowManyNachrichten();
    if (n == 0) {
        return false;
    }
    return true;
}
现在,在我的应用程序中的另一个地方,我想根据有多少条消息来确定是显示还是隐藏元素。因为这已经在NachrichtenBubble.ShowBubble中完成了,所以我希望能够从单独的类调用ShowBubble,让我们将其称为OtherClass.java,并根据结果进行操作

如果我将其放入OtherClass.java中,我会从Nachrictenbubble类型错误中得到一个无法对非静态方法ShowBubble进行静态引用的错误:

public boolean ShowNachrichten() {
    boolean m = NachrichtenBubble.ShowBubble();
    return m;
}
我已经通读了关于这里的其他静态/非静态方法问题的答案,这是有教育意义的,但我无法将它们成功地应用于这个问题。我曾尝试在NachrichtenBubble.java中创建一个新的上下文方法,并从OtherClass.java调用它,但它不起作用


我是否应该坚持尝试基于上下文的解决方案,或者我是否可以尝试从Nachrichtenuble.ShowBubble获得其他类中可用的结果。ShowNachrichten?

您对Nachrichtenuble的调用是静态的,换句话说,您没有该类的实例。不过,ShowBubble方法是一个实例方法。您可以将ShowBubble方法更改为静态,但前提是它调用的gethowmannachrichten方法也可以设置为静态,并且不使用任何实例字段,考虑到名称,这似乎不太可能

换言之,如果没有一个特定的纳氏体,你可能不知道有多少纳氏体,所以你不能询问这些信息

或者,您可以让您的其他类知道Nachrictenuble的这个实例


另一方面,我可能不会重复使用这样的方法。特别是因为您可以用getHowManyNachrichten>0替换整个方法,这与Tapestry完全无关,而是一个纯Java和面向对象编程问题。您可以将ShowBubble和getHowManyNachrichten更改为静态方法,或者在ShowNarichten中创建一个名为NarichtenBubble的NarichtenBubble字段,并改为调用NarichtenBubble.ShowBubble。顺便说一句,您的方法名与Java约定格格不入,因此很难阅读和理解。

另外,请注意,与C不同,方法名应该以小写字母开头。对于方法的编写,这当然是一个偏好问题?我可以把它写成布尔m=gethowmannachrichten>0?真:假;,但是这样做有什么好处吗?关键在于语句的长度、最终的可读性以及需要扫描多少代码。在这里,您定义了一个7行方法,它只能是一行上的内联语句。是的,但是随着你在软件开发方面越来越熟练,你会发现你读代码的频率比写代码的频率要高,而且要读的代码越多,就越难读。当然,有时更少的代码实际上会降低可读性,但在我看来,这并不适用于这里。关于这一点的一篇非常好的文章可以在StackOverflow btw的一位联合创始人的网站上阅读