我有一个公共单元课。我只想访问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。良好的计划实践表明,方法应该是静态的。
我想我的设计很糟糕。关于如何重构这个的任何建议?
答案 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,使用单独的数据访问对象(也称为存储库)从数据库中检索数据并填充域对象。