Java:返回类(不是实例)

Mar*_*aux 11 java static class-design return-value

是否可以在静态方法中返回一个类?我会解释...

我有:

public class A { public static void blah(){} }
public class B { }
Run Code Online (Sandbox Code Playgroud)

我想在B女巫回归中创建一个静态方法A.所以你可以这样做:

A.blah();
Run Code Online (Sandbox Code Playgroud)

B.getA().blah();
Run Code Online (Sandbox Code Playgroud)

这样,无需创建实例A.只需使用它静态方法.

这可能吗?

Ste*_*n C 7

这是对@ irreputable的答案的反驳:

public class B { 
    public static A getA(){ return null; }
}

B.getA().blah(); //works!
Run Code Online (Sandbox Code Playgroud)

它"有效",但可能不是你所期望的,当然也不是有用的.我们将其分为两部分:

A a = B.getA();
a.blah();
Run Code Online (Sandbox Code Playgroud)

第一个语句返回一个(在本例中为null)实例A,第二个语句忽略该实例并调用A.blah().所以,这些陈述实际上相当于

B.getA();
A.blah();
Run Code Online (Sandbox Code Playgroud)

或者(鉴于这getA()是无副作用的),简单明了

A.blah();
Run Code Online (Sandbox Code Playgroud)

这是一个更清楚地说明这一点的例子:

public class A {
   public static void blah() { System.err.println("I'm an A"); }
}

public class SubA extends A {
   public static void blah() { System.err.println("I'm a SubA"); }
}

public class B { 
   public static A getA(){ return new SubA(); }
}

B.getA().blah(); //prints "I'm an A".
Run Code Online (Sandbox Code Playgroud)

......而且(我希望)说明了为什么这种方法无法解决OP的问题.


zed*_*doo 6

不,这是不可能的.您有两种选择:

  1. B.getA()返回A的实例,并且blah()是非静态方法.

  2. 直接打电话A.blah().


cyb*_*org 6

我猜你问这个问题的原因是你希望B返回许多不同行为的不同类 - 不仅仅是A.

您可能希望使用接口来代替您所做的事情.

interface IA {
  void blah();
}

public class B {
  IA getA1() {
     return new IA {
        void blah() {
           ...code...
        }
     }
  }
  IA getA2() {
     ...
  }
  IA getA3() {
     ...
  }
}

myCallingMethod {
   B.getA1().blah();
   B.getA2().blah();
   B.getA3().blah();
}
Run Code Online (Sandbox Code Playgroud)