我正在创建几个将从数据库中收集数据的线程。
然而,在所有这些线程中,我需要对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 :(得分:2)
您不应仅仅根据共享某些代码或某些变量的需要来决定变量的放置。如果您的抽象类的设计理念是扩展它的所有内容必须可以访问Database
,那么您将Database
放在基类中。
另一方面,如果某些预期的实现与数据库无关,则不应将Database
添加到抽象基类。当然,您不仅限于继承层次结构的两个级别:您始终可以从没有commandtest
的{{1}}开始,并为需要数据库的所有内容添加另一级抽象类:
Database
答案 1 :(得分:1)
既然你说
在所有这些线程中,我需要对我的数据库进行本地引用 对象
你的第二种方法似乎合适。
我会将db
变量声明为私有,因为每个线程的变量会有所不同(这就是我对你的问题所感受到的)。否则,可能会错误地在实现类之间共享。
private Database db;
并公开abstract setDatabase(Database database)
方法,以便每个实现类设置其数据库。