我如何弄清楚什么类称为静态方法?

时间:2011-01-24 23:30:24

标签: java groovy

我有一个班级:

class Superclass { static List list() { ... } }

和子类:

class Subclass extends Superclass { ... }
class Subclass2 extends Superclass { ... }

我想调用这样的list方法:Subclass.list()Subclass2.list(),并根据调用它的子类做一些不同的事情。

有没有办法告诉哪个子类调用list方法?

注意:我不想在每个子类中覆盖list方法。

更新:每个人都说这是糟糕的设计,在大多数情况下我认为会是这样,但在我的情况下,我不这么认为。我的ORM定义了java.lang.Class的方法。我想提供我的ORM方法的简写,以便我可以说User.list(...)而不是ORM.list(User.class, ...)

5 个答案:

答案 0 :(得分:1)

听起来像是接口/实现问题。

为list()方法创建一个接口,然后编写两个实现,Subclass使用implementation1,Subclass2使用implementation2。

<强>更新

查看我的评论,看看这个问题How do I find the caller of a method using stacktrace or reflection?

与所有人的评论一样,我认为您需要重新考虑您的设计,并且要么像Oli所述覆盖子类中的方法,要么创建接口和实现。

答案 1 :(得分:1)

你的意思是子类会调用该方法吗?那么这应该是一个实例方法(不是静态的),抽象的,子类将提供实现。

或者你的意思是覆盖静态方法?这是不可能的,至少不是有意义的。您可以尝试通过在子类中定义超类静态方法来隐藏它,但这不是真正的继承关系。

答案 2 :(得分:1)

我同意这不是最好的设计。无论如何,如果你有令人信服的理由,这是一个解决方案 -

以下代码段应打印

SuperClass.list() - 由子类调用

SuperClass.list() - 由Subclass2

调用
...
    static List list() { 
      System.out.println("SuperClass.list() - called by "+Thread.currentThread().getStackTrace()[3].getClassName());
//[3] because you want to skip these last three calls to get to this information -:)
     }
...

答案 3 :(得分:0)

你可以让list方法取一个arg,调用像

这样的方法
Subclass.list(type)

然后测试类型。它有点思路。您可能想要考虑不同的设计选项。创建

可能更好
listForSubclass1 

listForSubclass2

方法,但即便如此,这似乎也不对......

答案 4 :(得分:0)

至于知道是谁打电话:一般来说,找出通话类也没什么不同。传统上,这是通过抛出异常,捕获它并检查堆栈跟踪来完成的。但是后来JDK有方法访问堆栈跟踪而不抛出异常(Thread.getStackTrace(),从1.5开始可用)。