【问题标题】:How to return current object by static method?如何通过静态方法返回当前对象?
【发布时间】:2017-08-11 20:17:16
【问题描述】:

下面有一个简单的代码

class Test{

  public static Test create(){
    return this;// this is non-static context
  }

  public static void main (String[] args){
    Test ob = Test.create();
  }
}

如何创建这样的对象? 如果我删除静态然后无法调用 Test.create() 方法。 实际上它与

有关
Toast toast = Toast.makeText(Context,CharSeqText,int);

【问题讨论】:

  • 你的问题没有意义。静态上下文中没有“当前”对象。您是否尝试创建一个新对象?
  • 据我所知this 代表当前对象。是不是错了..??
  • 是的,但是,static任何对象之外。因此,正如 shmosel 所指出的,没有this
  • 正确,但是在静态上下文中没有当前对象,所以this没有意义。

标签: java


【解决方案1】:

你会使用静态工厂

public class Test{

  private Test() {
    //Prevent construction by other classes, forcing the 
    // use of the factory
  }

  public static Test create(){
    return new Test();
  }

  public static void main (String[] args){
    Test ob = Test.create();
  }
}

我对您的示例进行了一些更改,以表明这种方式只能通过工厂获取实例。这使您可以控制创建实例的方式(和数量)。

例如,您还可以使工厂始终返回相同的实例(单例)

private static Test instance;
public static Test create(){
   synchronized (Test.class) {
      if(instance == null)
         instance = new Test();
   }

   return instance;
}

这样Test 类只会被创建一次。

根据您的具体要求,您可以在工厂方法中构建许多其他变体。

【讨论】:

  • 这是一个糟糕的单例实现。
  • 同意,但它是“经典单例”,确实展示了静态工厂的多功能性。
  • 您发布的实现是错误的。方法create()可以并发运行,返回两个不同的instance对象。
  • @easyjoin.net 是的,但最初的问题是处理静态工厂模式。为了一个干净的例子,我没有用同步块和线程锁混淆代码。
  • 请阅读此stackoverflow.com/questions/2094211/…。您的singleton 实现是错误的,单例模式与静态工厂无关。
【解决方案2】:

您可以返回新的测试。

public static Test create(){
    return new Test();
}

这被称为对象创建模式的静态工厂方法。 Item 1 of the Effective Java Joshua Bloch 的书。

【讨论】:

  • 实际上,这有点取决于Test。在问题中显示的示例代码中,是的,您可以返回一个新的 Test 实例。我的猜测是,除了这个 Test 类(例如,Android 中的 Context)之外,OP 还考虑了其​​他东西,并且有些类创建新实例将无法正常工作(例如,在 Android 中,试图通过new 创建一个Activity 实例。
  • 是的。我完全同意你的看法。从问题中,我了解到他想使用静态方法创建一个 Test 对象实例,因为我们可以使用静态方法 makeText 创建一个 Toast 对象。
  • 是的,我是安卓新手。??
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多