2013-04-30 4 views
1

Я создаю несколько потоков, которые будут собирать данные из базы данных.Полиморфизм и локальные переменные

Однако во всех этих нитях я потребуется локальная ссылка на мой Database объект, насколько я знаю, что есть два способа сделать это либо я использовать интерфейс:

public interface Command { 
void execute(); 
void collectData(); 
void processData(); 
void setData(ArrayList<Objects> data); 

}

А затем установите переменную вручную в каждом из классов thead (который расширяет командный интерфейс)

Однако, выполняя свой тест и поиск, я обнаружил, что могу делать следующее:

public abstract class commandtest implements Runnable{ 
    Database db; 
    abstract void execute(); 
    abstract void collectData(); 
    abstract void processData(); 
    abstract void setData(ArrayList<Objects> data); 
} 

Здесь у вас есть абстрактный класс, который может расширить каждый из моих объектов потока, а затем создать конструктор для установки необходимых переменных.

Мой вопрос довольно прост, какой из этих двух методов является наилучшей оценкой?

+0

Нет «лучшего», есть «лучшее для ситуации». –

+0

@DaveNewton Как мне это решить? какие факторы я должен принять во внимание? –

+1

У меня был бы объявленный интерфейс и абстрактный класс, который реализует интерфейс, который имеет атрибут 'protected Database db', –

ответ

2

Вы не должны принимать решение о размещении переменных, основанных исключительно на необходимости совместного использования какого-либо кода или некоторых переменных. Если ваш абстрактный класс разработан с идеей, что все его расширение должно иметь доступ к Database, то вы помещаете Database в базовый класс.

С другой стороны, если некоторые из предполагаемых реализаций не будут иметь ничего общего с базой данных, то вы не должны добавлять Database в абстрактный базовый класс. Конечно, вы не ограничены только два уровня иерархии наследования: вы всегда можете начать с commandtest, который не имеет Database, и добавить еще один уровень абстрактных классов для всего того, что действительно нуждается в базе данных:

abstract class AbstractCommandTest { 
    abstract void execute(); 
    abstract void collectData(); 
    abstract void processData(); 
    abstract void setData(ArrayList<Objects> data); 
    // Other methods shared by all commands 
} 
abstract class AbstractDatabaseCommandTest extends AbstractCommandTest { 
    protected Database db; 
    protected AbstractDatabaseCommandTest(Database db) { 
     this.db = db; 
    } 
} 
class SomeCommandThatDoesNotNeedDatabase extends AbstractCommandTest { 
    ... 
} 
class DatabaseCommand1 extends AbstractDatabaseCommandTest { 
    ... 
} 
class DatabaseCommand2 extends AbstractDatabaseCommandTest { 
    ... 
} 
1

С вы говорите, что

во всех этих нитях я потребуется локальная ссылка на мою базу данных объекта

вашего второй подход кажется соответствует priate. Я бы объявила переменную db частной, так как она будет отличаться для каждой темы (это то, что я чувствовал по вашему вопросу). Иначе это может быть ошибочно принято для совместного использования между классами реализации.

private Database db; 

и разоблачить abstract setDatabase(Database database) метод, так что каждый класс реализации устанавливает свою базу данных.

+1

Забавный, вы должны упомянуть об этом после того, как я просмотрел его снова. Я сделал это только красиво. –

Смежные вопросы