gpt4 book ai didi

java - 从单个 Java 方法返回多个值

转载 作者:行者123 更新时间:2023-11-30 06:30:27 27 4
gpt4 key购买 nike

这是场景:

Java 方法 public _____ SubmitData(Data data) 的调用者期望在提交的数据已成功处理时得到确认号,如果未成功处理,则期望返回代码。

我可以想到三种方法来做到这一点。

方法一:

返回一个包含确认号和 ReturnCode 作为实例字段的可序列化对象。

public class Foo {

private String confirmationNumber;

private ReturnCode returnCode;

public Foo(ReturnCode returnCode) {
this(null, returnCode);
}

public Foo(String confirmationNumber, ReturnCode returnCode) {
if ((returnCode == ReturnCode.OK && confirmationNumber == null)
|| (returnCode != ReturnCode.OK && confirmationNumber != null)) {
throw new IllegalArgumentException("Bad combination of parameters.");
}
this.confirmationNumber = confirmationNumber;
this.returnCode = returnCode;
}

public enum ReturnCode {

OK, ERROR1, ERROR2, ERROR3, ERROR4, ERROR5;

}

}

这种方法的问题是强制执行对象的正确实例化。调用代码需要知道对象创建的规则(例如,不能使用 ReturnCode.OK 和 null 确认号实例化 Foo。)

方法2:

返回一个接口(interface)或抽象类型,并根据方法中处理数据的成功或失败创建 Foo 的变体,如下例所示:

public abstract class Foo {

public abstract String getConfirmationCode();

public abstract ReturnCode getReturnCode();

}


public class GoodFoo extends Foo {

private final String confirmationCode;

private final ReturnCode returnCode = ReturnCode.OK;

public GoodFoo(String confirmationCode) {
this.confirmationCode = confirmationCode;
}

@Override
public ReturnCode getReturnCode() {
return returnCode;
}

@Override
public String getConfirmationCode() {
return confirmationCode;
}

}


public class BadFoo extends Foo {

private final ReturnCode returnCode;

public BadFoo(ReturnCode returnCode) {
if (returnCode == ReturnCode.OK){
throw new IllegalArgumentException("BadFoo cannot have a good return code");
}

this.returnCode = returnCode;

}

@Override
public ReturnCode getReturnCode() {
return returnCode;
}

@Override
public String getConfirmationCode() {
return null;
}

方法3:

使返回类型为字符串,并将确认号返回为字符串,对于任何错误的返回代码,都会引发已检查的异常。这是一种经过尝试和测试的方法,它肯定会起作用,但是如果有其他参数返回给调用者,无论响应是成功还是失败怎么办?或者,如果成功有多个返回代码(例如 ReturnCode.OK_WRITTEN_TO_DB、ReturnCode.OK_QUEUED 等)

我想知道在这种情况下是否有可以遵循的最佳实践?

最佳答案

方法3是Java方式。返回值并抛出失败代码作为异常。

方法 1 更接近 Haskell 方式,Haskell 有办法克服你提到的限制(例如幻像类型),但对于 Java,只需坚持异常,这是祖先的意图。

关于java - 从单个 Java 方法返回多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46268043/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com