我有一个读取的服务接口
package services;
import domain.Items;
public interface IItemsService extends IService {
public final String NAME = "IItemsService";
/** Places items into the database */
public void storeItem(Items items);
/** Retrieves items from the database
*
* @param category
* @param amount
* @param color
* @param type
* @return
* @throws ClassNotFoundException
*/
public Items getItems (String category, float amount, String color, String type) throws ItemNotFoundException, ClassNotFoundException;
}
一家看起来像这样的工厂......
package services;
public class Factory {
public Factory(){}
@SuppressWarnings("unchecked")
public IService getService(String name) throws ServiceLoadException {
try {
Class c = Class.forName(getImplName(serviceName));
return (IService)c.newInstance();
} catch (Exception e) {
throw new ServiceLoadException(serviceName + "not loaded");
}
}
private String getImplName (String name) throws Exception {
java.util.Properties props = new java.util.Properties();
java.io.FileInputStream fis = new java.io.FileInputStream("properties.txt");
props.load(fis);
fis.close();
return props.getProperty(serviceName);
}
}
这应该非常简单 - 但是我一直遇到两个错误 - 无法将IService解析为类型(在工厂和服务上),并且serviceName也无法在工厂中解析为变量错误。我知道我错过了一些简单的事情......
答案 0 :(得分:1)
第二个错误很简单:没有名为serviceName
的变量。如果您认为有,请指出其声明。我怀疑你意味着使用参数 - 在这种情况下,只需更改参数名称以匹配您尝试使用的名称:
public IService getService(String serviceName) throws ServiceLoadException
...
private String getImplName (String serviceName) throws Exception
这是一个非常简单的错误 - 您应该考虑一下您的诊断会让您自己解决这个问题。 (你也应该更明智地缩进你的代码,顺便说一句。)
至于遗漏的IService
- 我们不知道IService
在哪里宣布,这使得你很难在这方面帮助你......
答案 1 :(得分:1)
关于类型错误:如果IService
不在包services
中,那么IItemService
将无法访问它,您需要import some.package.name.IService
。
第二个答案很简单:在getService
和getImplName
方法中,参数名为name
。在方法体中,您将其称为serviceName
。您应该将name
更改为每个serviceName
。
另一方面,如果您尝试访问实例变量,请注意在Java中您必须先声明所有实例变量,然后才能访问(读取/写入)它们。您需要修改类:
public class Factory {
private String serviceName;
public Factory () {}
// other code
}