从外部类非静态构造函数访问内部类的静态方法

时间:2014-06-12 17:08:32

标签: java static inner-classes

我有一个公共单元课。我只想访问GeofenceUnit类THROUGH Unit类。因此,我将GeofenceUnit作为Unit的内部类。一个单位有许多GeofenceUnits。因此,当我实例化一个Unit时,我想在Unit对象中存储许多GeofenceUnits。

public class Unit {
  public ArrayList<Unit.GeofenceUnit> geofences;

  public Unit(int id){
    this.id = id;
    geofences = this.geofence.fill();

  }

  private static class GeofenceUnit {
    ArrayList<GeofenceUnit> geofences;
    private static ArrayList<Unit.GeofenceUnit> fill(){
      ...
      while(resultSet.next()){
        geofences.add(new Geofence());
      }

      return geofences;
    }
  }
}

您可能已经注意到,上面代码的问题是我试图在Unit的构造函数中调用静态方法fill()。这会产生警告&#34;来自Unit.GeofenceUnit类型的静态方法fill()应该以静态方式访问&#34;。我绝对同意这个警告。我不想通过静态方式访问它。但是,如果我从GeofenceUnit类定义及其fill()方法签名中删除静态修饰符,那么它在逻辑上没有意义。为什么我会在实例方法中填充许多GeofenceUnits。良好的计划实践表明,方法应该是静态的。

我想我的设计很糟糕。关于如何重构这个的任何建议?

2 个答案:

答案 0 :(得分:1)

&#39; this&#39;修饰符意味着你所引用的GeofenceUnit应该被证实,这是静态的,这是不可能的。您应该直接访问类的静态方法,如Jhon Skeet所说:GeofenceUnit.fill()

答案 1 :(得分:1)

当你在构造函数中说

geofences = this.geofence.fill();

这就是说类Unit有一个名为geofence的实例成员变量,这里不是这样。 (无论如何,它不是所示代码示例的一部分。)

此外,由于您要调用的方法是静态的,因此不需要涉及实例(并且避免在对象实例上调用静态方法是更好的样式)。为了在GeofenceUnit上调用静态方法fill(),您应该将行更改为

geofences = Unit.GeofenceUnit.fill();

如果该方法与该类的实例无关,那么该方法是静态的。但是使用静态方法使数据库调用变得很丑陋,这使得很难模拟查询结果,并将业务逻辑与基础结构代码纠缠在一起。

当你创建一个内部类静态时,意味着外部类与它之间没有连接,内部类无法访问外部类。因此,静态内部类可以独立于外部类实例进行实例化,但它也不具有对外部类的任何实例的任何特殊访问权限。我不确定这是一个静态内部类,甚至是内部类。

我认为通过进行JDBC调用in the constructor或将数据库访问放在静态方法中,您的生活并不容易。这种方法似乎过于关注隐私,并且对single-reponsibility principle或简单的单元测试不够关注。

另一种方法是让域对象do not know how they are populated,使用单独的数据访问对象(也称为存储库)从数据库中检索数据并填充域对象。