我想问一些令我困惑的事情。这是场景,假设我有一个方法preparePayload
,它接受一些参数,如messageType
,destAddr
等。方法的任务是构造一个完整的有效载荷(带头,前缀等) 。这是问题,我想返回statusCode
(这是枚举,如STATUS_OK
,STATUS_INVALID_DEST
,STATUS_INVALID_MSG_TYPE
等等,而不是返回状态I&#39 ; d喜欢实现我的逻辑。但如果没有错误(STATUS_OK
),我需要准备好的有效负载继续前进。所以我的方法应该返回eighter有效载荷或状态代码。
在C语言中,简单地将有效负载缓冲区地址作为preparePayload方法的参数发送,可以完美地解决问题。当方法返回时,只需从缓冲区地址读取有效负载并继续运行应用程序即可。如何在Java中实现这种逻辑?
另外,preparePayload
方法只是我给出的一个例子,所以我实现的方法可能会返回String
,int[]
,我写的一些类对象等等。我的意思是,方法应该成功返回的对象类型可能会有所不同。
任何建议都会受到欢迎。
答案 0 :(得分:1)
除了更改为异常之外,还有一种允许“输入/输出”参数的hackish方式,例如:
public ResultEnum preparePayLoad(List<PayLoad> toPrepare, ... other args) {
...
PayLoad newThing = ...
...
toPrepare.add(newThing);
return someEnum;
}
所以,你可以使用这种方法“模仿”“C风格”;但Java / OO越多
public PayLoad preparePayLoad(args) {
...
PayLoad newThing = ...
...
return newThing;
}
并抛出(选中或取消选中)错误情况的异常。
答案 1 :(得分:0)
Java中的正确习惯是抛出一个检查过的异常(有些人会说未经检查更好,这里有一点争议。)
您获得的三个重要机制是:
将错误代码自动传播到堆栈中。如果你不在代码中处理某种类型的错误(不检查它),它将作为异常传播 - 你不需要分层检查(并避免返回无效结果的错误,很常见在C),
异常作为“备用返回类型”工作,确保正确结果和错误消息的类型安全性(错误消息是完整对象 - 除了代码之外可以包含任意数量的有用信息)
< / LI>检查异常允许编译器检查是否以某种方式处理了所有重要的错误状态。
答案 2 :(得分:0)
您可以创建一个类,一个包装器,例如:
public class Result {
public enum Status {
STATUS_OK, STATUS_INVALID_DEST, STATUS_INVALID_MSG_TYPE
}
Status status;
String payload;
}
将由您的方法preparePayload
返回。然后,当你调用你的方法时,你可以这样做:
Result result = preparePayload(args);
//better will be a switch with case for each possible status
if (result.state == Result.State.STATUS_OK)
//do what you want with payload
System.out.println(result.payload);
else
return;