在自我维护的Singleton类中使用此关键字或始终使用实例

时间:2017-01-18 00:18:19

标签: java android singleton this locationmanager

我正在实现一个维护自身的单例类,这意味着它有一个私有构造函数和一个getInstance方法

public class GPSTracker implements LocationListener {

  private static GPSTracker instance;
  private LocationManager locationManager;
  private field1, field2 ...;

  public static GPSTracker getInstance() {

        if(instance == null)
            instance = new GPSTracker();
        return instance;
    }

  ...
}

问题1

由于这个GPSTracker类维护着自己的单例对象(称为instace),我在这个类中实现的每个引用类字段/成员的方法应该使用如下成员:this.field1 或总是instance.field1

问题2 :(类似于1)

正如您所见,在上面的示例中,我需要从LocationListener 覆盖抽象方法,通常直到现在注册到GPS就像:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, this);

由于我在同一个类中实现了覆盖,我是否还需要在这里使用instance单例obejct(而不是这个)?

如果您能说明原因,我会感激不尽?

2 个答案:

答案 0 :(得分:3)

使用this,这样如果您以后希望它不是单身人士,那么所有代码​​都不必更改。 getInstance()方法应该是使用静态instance字段的唯一方法。

它被称为separation of concerns

getInstance()方法是唯一关注类的单例方面的方法。

答案 1 :(得分:1)

答案适用于这两个问题。

简答:

从技术上讲,它并不重要。使用 this.field1 instance.field1 (在单例中)。

虽然它在两种情况下都是正确的并且相同(使用 this instance 对象)但是更推荐使用 this 关键字。

答案稍长:

考虑到这一点,我意识到它并不重要,在这种情况下,单例对象将调用将引用类成员的方法。
由于单身对象将是来电者 - 使用 this.field1 会引用单身人士 field1

即使一个类维护多个对象(来自同一类型的对象),只要对象调用其成员, this 将始终有效并引用调用者& #39; s字段。
这是 this 关键字的全部技巧!

结论 - 更好的做法是使用 this.field 代替 instance.field

Andreas也给了一个好点 - 使用 this 所以如果将来你将使该课程成为非单身人士,那么你的代码就会为你和你准备好我们不需要将所有 instance.field 更改回 this.field (如他所提到的那样关注他们的分歧)。