我有以下类作为项目中所有模型的基础:
public abstract class BaseModel
{
static String table;
static String idField = "id";
public static boolean exists(long id) throws Exception
{
Db db = Util.getDb();
Query q = db.query();
q.select( idField ).whereLong(idField, id).limit(1).get(table);
return q.hasResults();
}
//snip..
}
然后我尝试通过以下方式从中扩展:
public class User extends BaseModel
{
static String table = "user";
//snip
}
但是,如果我尝试执行以下操作:
if ( User.exists( 4 ) )
//do something
然后,它不是查询:“SELECT id FROM user WHERE id = ?”
,而是生成查询:“SELECT id from null WHERE id = ?”。因此,覆盖 User
类中的 table
字段似乎没有任何效果。
我该如何克服这个问题?如果我向 BaseModel 添加一个 setTable()
方法,并在 User
的构造函数中调用 setTable()
,那么 的新值将code>table
也可用于 User
类的所有方法吗?
最佳答案
您不能覆盖 Java 中任何类型的静态方法或字段。
public class User extends BaseModel
{
static String table = "user";
//snip
}
这将创建一个新字段 User#table
,它恰好与 BaseModel#table
同名。大多数 IDE 都会对此发出警告。
如果您更改 BaseModel 中字段的值,它也将应用于所有其他模型类。
一种方法是使用通用的基方法
protected static boolean exists(String table, long id) throws Exception
{
Db db = Util.getDb();
Query q = db.query();
q.select( idField ).whereLong(idField, id).limit(1).get(table);
return q.hasResults();
}
并在子类中使用
public static boolean exists(long id)
{
return exists("user", id);
}
如果你想使用字段方法,你必须创建一个 BaseDAO
类并有一个 UserDAO
(每个模型类一个)来相应地设置字段。然后创建所有 daos 的单例实例。
关于Java:覆盖父类的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19457114/