正在重写一个方法以传递一个被认为是错误做法的静态常量



假设我有这样的东西:

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")
   {
   }
}

相关内容

最新更新