I have the following class which I'm using as the base of all the models in my project:
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..
}
I'm then trying to extend from it, in the following way:
public class User extends BaseModel
{
static String table = "user";
//snip
}
However, if I try to do the following:
if ( User.exists( 4 ) )
//do something
Then, rather than the query: "SELECT id FROM user WHERE id = ?"
, it is producing the query: "SELECT id from null WHERE id = ?". So, the overriding of the table
field in the User
class doesn't seem to be having any effect.
How do I overcome this? If I added a setTable()
method to BaseModel, and called setTable()
in the constructor of User
, then will the new value of table
be available to all methods of the User
class as well?
You cannot override static methods or fields of any type in Java.
This creates a new field
User#table
that just happens to have the same name asBaseModel#table
. Most IDEs will warn you about that.If you change the value of the field in BaseModel, it will apply to all other model classes as well.
One way is to have the base methods generic
and use it in the subclass
If you want to use the field approach, you have to create a
BaseDAO
class and have aUserDAO
(one for each model class) that sets the field accordingly. Then you create singleton instances of all the daos.Because Java doesn't allow you to override
static
members, you basically need to resort to the slightly more verbose but overall nicer singleton pattern, wherein you're still conceptually writing "static" code, but you're technically using (global/singleton/"static") instances, so you're not restricted by the limitations ofstatic
.(note that you also need to use methods because fields don't participate in polymorphism, and thus cannot be overridden)
Outputs:
In order to do what you are looking to do, don't make
table
static in theBaseModel
. Then in the other classes that inherit fromBaseModel
, you can settable
in the default constructor to whatever you wish.