我编写 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/