我有一个将对象存储在列表中的类。我有3种不同类型的列表,我想将对象保存在各自的列表中。如您所见,我必须重复该方法3次,每种类型一次,尽管在每种情况下,该方法执行的功能完全相同。
题:
有没有一种方法可以使用例如泛型或接口的一种方法来编写相同的功能?
原始代码:
@Repository
public class ItemsInMemoryDao {
static List<MyCompany> companies = new ArrayList<>();
static List<Financial> financials = new ArrayList<>();
static List<Stock> stocks = new ArrayList<>();;
// TODO: Rewrite using generics or interface?
static void saveCompany(MyCompany company) {
companies.add(company);
}
static void saveFinancial(Financial financial) {
financials.add(financial);
}
static void saveStock(Stock stock) {
stocks.add(stock);
}
}
请求状态:
@Repository
public class ItemsInMemoryDao {
static List<MyCompany> companies = new ArrayList<>();
static List<Financial> financials = new ArrayList<>();
static List<Stock> stocks = new ArrayList<>();;
static void save(Object object) {
// implementation here
}
}
有没有一种方法可以使用例如泛型或接口的一种方法来编写相同的功能?
是的,不,但是可以,但是不这样做。
可以使用称为“一个”的方法来完成save
吗?
是的,使用方法重载。
这是推荐的方法。
static void save(MyCompany company) {
companies.add(company);
}
static void save(Financial financial) {
financials.add(financial);
}
static void save(Stock stock) {
stocks.add(stock);
}
能用一种真正的方法完成吗?
是的,instanceof
在实现中使用。
这是非常气馁,因为你会失去了Java的类型安全。
static void save(Object object) {
if (object instanceof MyCompany)
companies.add((MyCompany) company);
else if (object instanceof Financial)
financials.add((Financial) company);
else if (object instanceof Stock)
stocks.add((Stock) company);
else
throw new IllegalArgumentException("Argument is of unknown type: " + object.getClass().getName());
}
例如,如果调用者尝试调用save("Foo")
,第一个解决方案将无法编译,因此您立即知道有问题,而第二个解决方案将编译就好了,直到尝试运行有问题的代码,您才知道有问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句