如何解决Java 中列表传递引用更新的替代方法
我有一个包含一个或多个输入列表的类,它需要处理和更新该类之外的其他列表。这里有什么好的模式可以使用? 我在这里尝试了以下两种模式:
- 使用传递引用直接更新
- 使用回调让调用者处理他们想要如何处理更新
示例
- 使用直接更新
public class SomeClass {
public void process(List<String> inputList,List<StringContainer> errorContainerList,List<String> validList) {
for (String str : inputList) {
if (someCondition) {
validList.add(str);
} else {
errorContainerList.add(new StringContainer(str,new SomeError()));
}
}
}
}
void someCaller(List<String> inputList) {
List<String> validList = new ArrayList<>();
List<StringContainer> errorContainerList = new ArrayList<>();
SomeClass obj = new SomeClass();
obj.process(inputList,errorContainerList,validList);
// Similarly,validList.remove(...);
errorContainerList.add(...);
}
- 使用回调
public interface StringErrorHandler {
void handle(String str,SomeError error);
}
public interface ValidInputHandler {
void handle(String str);
}
public class SomeClass {
public void process(List<String> inputList,StringErrorHandler errorHandler,ValidInputHandler validInputHandler) {
for (String str : inputList) {
if (someCondition) {
validInputHandler.handle(str);
} else {
errorHandler.handle(str,new SomeError());
}
}
}
}
void someCaller(List<String> inputList) {
List<String> validList = new ArrayList<>();
List<StringContainer> errorContainerList = new ArrayList<>();
SomeClass obj = new SomeClass();
obj.process(inputList,new StringErrorHandler() {
@Override
public void handle(String str,SomeError error) {
errorContainerList.add(new StringContainer(str,error));
}
},new ValidInputHandler() {
@Override
public void handle(String str) {
validList.add(str);
}
});
// Similarly,validList.remove(...);
errorContainerList.add(...);
}
解决方法
我不会使用它们。它们都不必要地复杂化。让我们想想你的实际问题是什么?如果你不关心错误处理,你可能会这样写:
public List<String> process(List<String> inputList) {
List<String> validList = new ArrayList<>();
for (String str : inputList) {
if (someCondition) {
validList.add(str);
}
}
return validList;
}
所以问题是你不能从java中的方法返回两个值。但是要处理这个问题,您可以添加一个具有这两个值的简单嵌套类,然后客户端可以轻松地提取它们:
public ProcessResult process(List<String> inputList) {
List<StringContainer> errorContainerList = new ArrayList<>();
List<String> validList = new ArrayList<>();
for (String str : inputList) {
if (someCondition) {
validList.add(str);
} else {
errorContainerList.add(new StringContainer(str,new SomeError()));
}
}
return new ProcessResult(validList,errorContainerList)
}
public static class ProcessResult{
public final List<String> validList;
public final List<StringContainer> errorContainerList;
public ProcessResult(List<String> validList,List<StringContainer> errorContainerList) {
this.validList = validList;
this.errorContainerList = errorContainerList;
}
}
void someCaller(List<String> inputList) {
List<String> validList = new ArrayList<>();
List<StringContainer> errorContainerList = new ArrayList<>();
SomeClass obj = new SomeClass();
ProcessResult pr=obj.process(inputList);
validList.addAll(pr.validList);
errorContainerList.addAll(pr.errorContainerList);
}
这样做更好的原因有几个,但最重要的是,您的方法没有副作用,并且方法的结果是显式返回的,这是我们在 java 中应该做的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。