【发布时间】:2018-03-29 06:27:16
【问题描述】:
我有一个接收事物列表的方法,迭代列表并在每次迭代时执行 XYZ 操作。 “XYZ 事物”的定义取决于实现或我想要实现的目标。 对于某些人来说,我只想运行一些 SQL 来访问数据库并更新客户姓名和发票到期日。对于其他人,我只想更新税额、逾期天数等。情况总是不同的。我如何只创建一个可重用的方法,而不是重复这个方法,这不是“OnceAndOnlyOnce”的精神。
DaoProvider daoProvider;
public void buildAndUpdateCustomer(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
//these are my XYZ things...
daoProvider.updateCustomerName();
daoProvider.updateAgingMia();
}
}
public void buildAndUpdateTax(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
daoProvider.updateTaxAmount();
}
}
public void buildAndUpdateLedgerBal(List<Object> list) {
for (Object obj : list) {
Map<String, Object> m = (Map<String, Object>) obj;
Map<String, Object> args = new HashMap<>();
for (Map.Entry<String, Object> x : m.entrySet()) {
args.put(x.getKey(), x.getValue());
}
daoProvider.updateLedgerBalance();
}
}
【问题讨论】:
-
你能以任何方式区分这些列表吗?
-
public void buildAndProcess(List<Object> list, Consumer<Object> processor) {。附言看看你的代码,你可能有太多Object- Java 是一种强类型语言,当有人有这么多Object和这么多的转换时,这是一个尖叫的危险信号。一般来说,一个人根本不应该看到太多Object的用法...... -
另外,代码没有意义——大概你应该将
args传递给调用。这又给我带来了另一个问题——你似乎使用List<Object>和Map<String, Object>作为本质上的通用参数——这是一个非常讨厌的反模式,它删除了编译器提供的所有类型安全,甚至删除了名称检查。我会强烈建议阅读一本关于 OO 编程的书。 -
@boristhespider 这不是生产代码。将要投入生产的版本已经有了泛型。
-
@JoshUzo 仿制药不是灵丹妙药。如果您仍然传递
Map作为一种存储方式,本质上是kwargs,那么该方法从根本上被破坏了。
标签: java for-loop arraylist foreach iteration