我的一些朋友告诉我,在构造函数中通过游标初始化对象是不好的做法。但我不确定。我初始化游标并在一个方法中创建对象(我不将光标传递给另一个方法)。在构造函数中,我也不会将光标移动到某个位置。
Cursor cursor = getVehiclesAsCursor();
while (cursor.moveToNext()) {
Vehicle vehicle = new Vehicle(cursor);
//Do something
}
if (cursor!=null) close.closeCursor();
我在Vehicle类中的构造函数
public Vehicle(Cursor cursor) {
id = cursor.getInt(cursor.getColumnIndex(_ID));
name = cursor.getString(cursor.getColumnIndex(NAME));
...
}
请告诉我,代码是好还是坏? 谢谢!
答案 0 :(得分:1)
我会考虑这种不良做法,原因如下:
游标是一种短命构造,只在事务中有效。如果对象的持续时间比事务长,并且保持对游标的引用,那么它在最好的情况下是一个过时的游标,并且在最坏的情况下会混淆事务处理
游标是一个高度实现的特定对象。在您的示例中,您将对SQL逻辑的数据对象创建依赖关系。为什么数据类需要知道如何从游标中读取数据,处理SQL错误等?它需要知道的只是它的数据。
这是第2点的扩展:您将数据类绑定到数据库实现。如果更改数据存储方式,则必须更改数据类。你不想要那个。
答案 1 :(得分:0)
这取决于对象的目的和对象的生命周期。如果对象的生命周期不必超过游标的生命周期,则可能没问题,例如,在What's the best way to iterate an Android Cursor?中有两个解决方案构造Iterable
以在游标上使用for(:)
循环,在这种情况下,将光标传递给这样的对象是不可避免的。
另一个问题是,在对象中存储可能在对象的生命周期内关闭或移动的游标是否是良好的做法。由于这会产生副作用,答案是否定的。即使您的代码现在不移动/关闭光标,某人(可能是您)可能稍后修改代码并面对错误 - 或者更糟糕的是,让用户面对此错误。
现在,人们希望在构造函数中看到什么参数?通常,存储在对象字段中的数据。 您不会将光标存储在字段中。 人们在构造函数中期望什么代码?创建内部数据结构所需的代码。如果数据结构很简单,人们希望构造函数很简单。
因此我的代码中有一个静态方法MyStuff.fromCursor(Cursor cursor)
。此方法负责初始化对象,但不负责构造。