Является ли переопределение метода для передачи статической константы плохой практикой? - PullRequest
2 голосов
/ 25 февраля 2012

Предположим, у меня есть что-то вроде этого:

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 ]

2 голосов
/ 25 февраля 2012

Я сделал это много.Во многих случаях при написании фреймворка базовый класс имеет getType() или getName() или какой-то такой абстрактный метод.Производные классы обычно переопределяют это, чтобы вернуть static значение члена`

1 голос
/ 25 февраля 2012

В этом конкретном примере кажется лишним иметь подкласс, чтобы просто вернуть другую константу.Я бы сделал объект AbstractDataClass неабстрактным и передал бы имя таблицы в качестве параметра конструктора.

0 голосов
/ 25 февраля 2012

Да, это приемлемая практика. 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;
   }
}
0 голосов
/ 25 февраля 2012

Если это единственная функциональность объекта 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")
   {
   }
}
...