重写一个传递静态常量的方法被认为是不好的做法?

时间:2012-02-24 22:02:31

标签: java inheritance override dao

假设我有这样的事情:

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()只是为了传递一个特定于每个子类的静态常量。这是可接受还是不好的做法?

4 个答案:

答案 0 :(得分:2)

我做了很多。很多时候编写框架,基类有getType()getName()或一些这样的抽象方法。派生类通常会覆盖此类以返回static成员的值`

答案 1 :(得分:1)

在这个特定的例子中,让子类只返回一个不同的常量似乎有些过分。我会使AbstractDataClass对象非抽象,并将表名作为构造函数参数传递。

答案 2 :(得分:0)

是的,这是一种可接受的做法。 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;
   }
}

答案 3 :(得分:-1)

如果这是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")
   {
   }
}