微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java 中列表传递引用更新的替代方法

如何解决Java 中列表传递引用更新的替代方法

我有一个包含一个或多个输入列表的类,它需要处理和更新该类之外的其他列表。这里有什么好的模式可以使用? 我在这里尝试了以下两种模式:

  1. 使用传递引用直接更新
  2. 使用回调让调用者处理他们想要如何处理更新

示例

  1. 使用直接更新
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(...);
}
  1. 使用回调
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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?