【问题标题】:Accessing static methods of inner class from an outer class nonstatic constructor从外部类非静态构造函数访问内部类的静态方法
【发布时间】:2014-06-17 04:19:35
【问题描述】:

我有一个公共单元课程。我只想通过 Unit 类访问 GeofenceUnit 类。因此,我将 GeofenceUnit 设为 Unit 的内部类。一个单元有许多地理围栏单元。因此,当我实例化一个 Unit 时,我想在 Unit 对象中存储许多 GeofenceUnit。

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()。这会产生警告“应以静态方式访问 Unit.GeofenceUnit 类型的静态方法 fill()”。我完全同意这个警告。我不想通过静态方式访问它。但是,如果我从 GeofenceUnit 类定义及其 fill() 方法签名中删除静态修饰符,那么它在逻辑上没有意义。为什么我要在一个实例方法中填充许多 GeofenceUnits。良好的程序实践表明方法应该是静态的。

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

【问题讨论】:

  • 只是一个提示,如果您正在寻找有关工作代码的建议,CodeReview SE 将是一个不错的发帖地点
  • 为什么不直接叫它GeofenceUnit.fill()
  • if I remove the static modifiers from the GeofenceUnit class definition and its fill() method signature。确保您了解拥有 static 嵌套类的含义。
  • @JonSkeet 我不知道您可以通过这种方式访问​​内部类。我以为你只能通过这个关键字访问内部类。
  • 这会带来其他问题,因为我确实需要从内部类访问外部类的成员变量,而静态内部类无法做到这一点。

标签: java static inner-classes


【解决方案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 的域对象,以及单独的数据访问对象(也称为存储库)来从数据库中检索数据并填充域对象。

【讨论】:

    【解决方案2】:

    “this”修饰符意味着您所指的 GeofenceUnit 应该是实例化的,这是不可能的,因为它是静态的。正如 Jhon Skeet 所说,您应该直接使用类访问静态方法:GeofenceUnit.fill()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多