java - Convention : when writing methods, 应该返回值,还是直接改数据?

标签 java python methods return conventions

我编写 Java 和 Python 代码已有一段时间了。我多次注意到,两种语言中的对象调用其方法的方式通常看似不一致。以这些 Python 代码片段为例。 (语法并不重要,只要注意方法处理数据的方式即可)

class Foo(object):
    def __init__(self, num = 0):
        self.num = num

    def __str__(self):
        return str(self.num)

    def addOne(self):
        self.num += 1

if __name__ == "__main__":
    foo = Foo()
    print(foo) # Outputs 0

    foo.addOne()
    print(foo) # Outputs 1

对比:

class Bar(object):
    def __init__(self, num = 0):
        self.num = num

    def __str__(self):
        return str(num)

    def addOne(self):
        return Bar(num + 1)

if __name__ == "__main__":
    bar = Bar()
    print(bar) # Outputs 0

    bar.addOne()
    print(bar) # Still Outputs 0

    bar = bar.addOne()
    print(bar) # Now Outputs 1

这两个示例非常相似,但是 Foo 类在您调用 Foo.addOne() 时会更改类内部的 num 变量。但是,Bar 类的 addOne() 方法返回一个新对象,其中 num 变量已更新。哪种情况在什么时候更可取,人们期望什么,这在不同语言之间有很大差异吗?

最佳答案

Java 有一些不可变的类。您(作为 Java 开发人员)也可以创建这样的类。即使您愿意,也不能更改不可变类中任何对象的内部状态(例如,您不能在不创建新的 Integer 对象的情况下将 1 添加到 Integer 对象,并且即使您愿意,也不能在不创建新的 String 对象的情况下将“a”附加到 String 对象)。

现在,如果一个类不是不可变的,您可以自由地采用这两种方法(更改现有实例的内部状态,或创建一个新实例)。但无论您采用哪种方法,您都应该记录下来,以便您的调用者知道会发生什么。至少据我所知,这就是它在 Java 世界中的工作方式。

关于java - Convention : when writing methods, 应该返回值,还是直接改数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27197191/

相关文章:

c++ - 向类及其所有子类添加功能

python - 在 Python 方法中设置属性

java - 返回 ArrayList 给出错误 : cannot find symbol

java - hibernate 中集合的@OneToMany 映射

java - 在方法中使用不同的 getter

python - 重定向 'git clone' 的 stdout/stderr/stdin

python - 亚马逊欧洲 MWS Python Boto 连接访问被拒绝

java - 如何让一个类正确实现接口(interface)?

python - 如何使用多个 GPU 和 Keras 来训练 GAN?

java - 将静态方法放在接口(interface)中是一种好习惯吗?