我正在开发一个智能项目,该项目包含一系列通过连接到串行端口的无线适配器进行通信的设备。在启动时,我想从数据库加载远程设备列表,其中存储了他们的限定名称(远程设备的示例是门传感器,运动传感器,加热系统......)。所有远程设备都是RemoteDevice
类的子类,因为它们使用相同的硬件进行通信。
问题是在运行时我不知道数据库中会有哪些设备,这应该动态完成。我发现了其他一些可以表明这一点的例子:
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("test.Demo");
Demo demo = (Demo) clazz.newInstance();
但是我不知道我会得到哪个类(可能有十几种设备类型),而且我的类没有默认构造函数。我的加载方法看起来像这样
public void loadDatabase(Connection dbConn) throws SQLException
{
String query = "SELECT * FROM smartHouse.device AS dev ";
try
{
Statement statement = dbConn.prepareStatement(query);
ResultSet devices = statement.executeQuery(query);
while(devices.next())
{
int id = devices.getInt("id");
String address = devices.getNString("HW Address");
String classpath = devices.getNString("ClassPath");
//parse classpath, create remote object instances and add them to device ArrayList
}
}
catch(Exception e)
{
}
}
任何帮助都将不胜感激。
答案 0 :(得分:0)
这样的工厂方法怎么样:
RemoteDevice createDevice (String className, String hardwareAddress) {
Class clazz = Class.forName(className);
RemoteDevice newDevice = (RemoteDevice) clazz.newInstance();
newDevice.setHardwareAddress(hardwareAddress);
}
这显然需要基类“RemoteDevice”中的setter“setHardwareAddress”和每个继承者中的默认构造函数。
如果构造函数中的参数始终相同,则工厂方法可能如下所示:
RemoteDevice createDevice (String className, String hardwareAddress) throws Exception {
Class clazz = Class.forName(className);
Constructor<RemoteDevice> constructor = clazz.getConstructor(new Class[]{String.class});
RemoteDevice result = constructor.newInstance(hardwareAddress);
return result;
}
有帮助吗?