假设我有这样的东西:
public abstract class AbstractDataObject
{
public abstract void gettableName();
public void delete()
{
SQLQuery("..." + getTableName()+ "..." );
}
}
public class DataObject extends AbstractDataObject
{
final static String tableName;
public String getTableName()
{
return tableName;
}
}
我希望方法delete()
为AbstractDataObject
的每个子类查询不同的表。因此,我重写getTableName()
只是为了传递一个特定于每个子类的静态常量。这是可以接受的还是不好的做法?
我已经做了很多。在编写框架的许多时候,基类都有一个getType()
或getName()
或一些这样的抽象方法。派生类通常会覆盖它以返回static
成员的值`
在这个特殊的例子中,拥有一个子类只是为了返回一个不同的常量似乎有些过头了。我会使AbstractDataClass
对象非抽象,并将表名作为构造函数参数传入。
是的,这是一种可以接受的做法。static final
变量在Java中可以被视为一种常量,我想这是在Java代码中使用常量的可能方法之一。
但是,您的代码不正确。这里是更正的一个:
public abstract class AbstractDataObject
{
public abstract String getTableName();
public void delete()
{
SQLQuery("..." + getTableName()+ "..." );
}
}
public class DataObject extends AbstractDataObject
{
final static String tableName = "some_table";
public String getTableName()
{
return tableName;
}
}
如果这是DataObject的唯一功能,那么考虑到您可以将所有表名放在一个列表中并在其上循环,这似乎真的太过分了:
List<String> tables = new List<String>{ "TabA","TabB","TabC"};
foreach( var tname in tables )
{
deleteTable(tname);
}
通过查看您的代码,我知道还有SQLQuery,您需要访问它,但我也会将其从AbstractDataObject中删除。
评论后:好的,好的,这是我的建议:
public abstract class AbstractDataObject
{
private String tableName;
public AbstractDataObject(String tableName)
{
this.tableName = tableName;
}
public void delete()
{
SQLQuery("..." + tableName + "..." );
}
}
public class SellerDataObject extends AbstractDataObject
{
public DataObject(): super("Seller")
{
}
}