gpt4 book ai didi

java - 在Java中修改void方法中的输入对象是不好的做法吗?

转载 作者:行者123 更新时间:2023-12-01 17:53:26 25 4
gpt4 key购买 nike

在 Java 中,假设您有一个带有属性 bar 的数据对象 object,您需要使用从外部完成的复杂操作返回的值来设置该属性。来源。假设您有一个方法 sendRequestToExternalSource,该方法将基于“对象”的请求发送到外部源,并获取一个包含(除其他外)所需值的对象。

这些设置值的方法中哪一种是更好的做法?

void main(MyObject object) {
bar = sendRequestToExternalSource(object);
object.setBar(bar);
}

String sendRequestToExternalSource(MyObject object) {

// Send request to external source
Object response = postToExternalSource(object);

//Do some validation and logic based on response
...

//Return only the attribute we are interested in
return response.getBar();
}

void main(MyObject object) {
sendRequestToExternalSourceAndUpdateObject(object);
}

void sendRequestToExternalSourceAndUpdateObject(MyObject object) {

// Send request to external source
Object response = postToExternalSource(object);

//Do some validation and logic based on response
...

//Set the attribute on the input object
object.setBar(response.getBar());
}

我知道它们都有效,但最佳实践是什么?

最佳答案

取决于具体场景。 副作用不错的做法,但也有用户根本不会想到的情况。

无论如何,您的此类方法的文档都应该清楚地说明您是否操纵了参数。必须告知用户这一点,因为他传递给您的方法的是他的对象。

<小时/>

请注意,有各种示例可以直观地预期副作用,但这也完全没问题。例如Collections#sort (documentation):

List<Integer> list = ...
Collections.sort(list);

但是,如果您编写像 intersection(Set, Set) 这样的方法,那么您会期望结果是一个新的 Set,而不是第一个。但您可以将名称改写为 intersect 并使用类似 Set#intersect(Set) 的结构。然后,用户会期望一个以 void 作为返回类型的方法,其中生成的 Set 是调用该方法的 Set

另一个例子是Set#add。您可能希望该方法插入您的元素,而不是它的副本。这也是它的作用。如果它创建副本,则会让人感到困惑。然后他们需要以不同的方式调用它,例如 CloneSet 或类似的东西。

<小时/>

一般来说,我倾向于给出避免操纵参数的建议。除非用户预期会有副作用,如示例所示。否则,您可能会迷惑用户并产生严重错误的风险太高。

关于java - 在Java中修改void方法中的输入对象是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47533673/

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