小编Mav*_*ode的帖子

在方法(Java 中)中改变对象参数是一种不好的做法吗?

我有一个关于改变方法中的方法参数(它们是对象)的问题。

我多次阅读和听到,在作为参数传入的方法中改变对象是一种不好的做法。例如:

public void modifyList(List<Object> list) {
    list.add(new Object());
}
Run Code Online (Sandbox Code Playgroud)

相反,应该复制传入的对象,应该对复制的对象执行突变,然后返回复制的对象。例如:

public List<Object> getModifiedList(List<Object> list) {
    List copy = new List<Object();
    //Make a deep copy if it would be necessary
    for(Object o : list) {
        copy.add(o.clone());
    }
    //Modify the copy
    copy.add(new Object());
    //return the copy
    return copy;
}
Run Code Online (Sandbox Code Playgroud)

我知道第二种方法产生副作用的可能性较小,因为它不会改变输入参数。

但这真的是正确的方法吗?由于必须创建大量深层副本,性能会受到影响。此外,为所有类实现复制构造函数和克隆方法会花费大量时间。它还会极大地增加LOC。

在实践中,我不经常看到这种模式(复制方法参数)。

有丰富经验的人(作为程序员/软件开发人员工作多年)可以回答这个问题吗?

问候马维林

java copy method-parameters

9
推荐指数
2
解决办法
1万
查看次数

如何在发送到 Spring Boot 休息控制器的请求正文中保留换行符

我很困惑。

我正在通过 Http Post 请求向 Spring Boot 休息控制器发送一个字符串。

该字符串包含由“\n”表示的换行符。

控制器使用“纯文本/文本”。

客户端是一个 python 程序,它从一个 json 对象的字段中读取字符串,该对象是从文本文件中读取的。

文本文件中的 json 对象如下所示: {"content": "Multi \n line \n string"}

但是,如果新行字符到达其余控制器,则会将它们转义为 '\\n',以便它们将显示为正常的 '\n' 作为字符串的一部分。

我试图从 python 发送一个不是从文本文件中读取的字符串。相反,我直接在带有换行符的变量中提供字符串:

payload = "new \n line \n string"
headers = {'content-type': 'text/plain'}

r = requests.post(url, data=payload, headers=headers)
Run Code Online (Sandbox Code Playgroud)

但是 '\n' 被转义为 '\\n' 这使得它成为字符串的正常部分,显示为“new \n line \n string”而不是“new line string”。

但是,如果我像这样通过邮递员发送字符串,则新行在到达控制器的字符串中被正确解释为 '\r\n' (设置了文本/纯标题):

通过邮递员邮寄

所以我的具体问题是,如何将我从 json 字段中读取的字符串从 python 发送到 rest 控制器,以便 java/spring-boot 不会转义 '\n' 字符,而是将其解释为换行符。有没有办法从python正确发送字符串(首选方式),或者我必须在spring服务器端做一些转换/编码?

如果我必须在 spring 服务器端进行转换/编码,如何确保如果我用我的 python 客户端发布到我无法控制的服务器,新行字符的解释是否正确?是否有任何标准或依赖于服务器端自定义转换/编码的标准?

控制器看起来像这样:

@RestController
class …
Run Code Online (Sandbox Code Playgroud)

python post http line-breaks spring-boot

7
推荐指数
1
解决办法
2540
查看次数

避免输出参数(没有副作用)

我正在阅读 Robert C. Martin 的《简洁代码》,但我无法完全理解第 44 至 45 页的“无副作用”和“输出参数”部分。

在“没有副作用”部分中,指出传递给方法参数的更改被视为副作用,不应执行。

在“输出参数”部分中,规定方法的参数不应改变。如果必须更改某些状态,则方法应该仅更改其所属对象的状态。

我确实理解,如果指定此行为的方法是由不完全意识到这一点的客户端调用的,则副作用和输出参数可能会导致令人困惑的行为和错误。此外,在多线程环境中工作时这也是有问题的。

但考虑到“干净代码”一书是基于 Java 示例编写的,我感到很困惑。

让我们看一个例子。假设我们有一个玩家类别:

public class Player {
    private int healthPoints;
    private boolean alive = true;

    public Player(int healthPoints) {
        if(healthPoints < 1) {
            throw new IllegalArgumentException();
        }
        this.healthPoints = healthPoints;
    }

    public boolean isAlive() {
        return this.alive;
    }

    public void fight(Player otherPlayer) {
        //do some fighting which will change this instance
        // but also the otherPlayer instance
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们现在调用以下函数:

player1.fight(player2);
Run Code Online (Sandbox Code Playgroud)

这将改变player1的状态以及player2的状态。在大多数情况下,罗伯特·C·马丁(Robert C. Martin)不鼓励这样做。但实际上,我经常看到这种模式。大多数 Java 程序确实存在突变,对象的更改超出了它们创建的范围。

如果我们创建一场改变两个玩家的战斗,情况会更糟,因为现在另一个对象在其方法内改变了两个参数: …

java coding-style side-effects parameter-passing

6
推荐指数
1
解决办法
1813
查看次数