Java 可变对象的getter中的深度复制
总是返回集合/对象字段的副本会有开销吗?当然会有开销,但是已经有一些框架类这样做了。《有效的Java》一书中也对其进行了描述 记住: “类应该是不可变的,除非有很好的理由使它们变为可变的……如果一个类不能变为不可变的,请尽可能限制它的可变性。” 当您想要创建不可变类时,可以使用如下框架:Java 可变对象的getter中的深度复制,java,oop,Java,Oop,总是返回集合/对象字段的副本会有开销吗?当然会有开销,但是已经有一些框架类这样做了。《有效的Java》一书中也对其进行了描述 记住: “类应该是不可变的,除非有很好的理由使它们变为可变的……如果一个类不能变为不可变的,请尽可能限制它的可变性。” 当您想要创建不可变类时,可以使用如下框架: 例如,请清楚地检查此项,是的,这将是一项开销。。。与返回引用或浅层副本相比 但这不是重点。真正的问题是开销是否合理/必要,以及是否可以通过使用其他数据结构/设计/技术来避免。这些问题的答案取决于上下文 以下是
例如,请清楚地检查此项,是的,这将是一项开销。。。与返回引用或浅层副本相比 但这不是重点。真正的问题是开销是否合理/必要,以及是否可以通过使用其他数据结构/设计/技术来避免。这些问题的答案取决于上下文
以下是一些插图:
字符串的任何getter
list.get(int)
,Iterator.next()
ArrayList.toArray(…)
将列表复制到单独的数组中,而不是返回列表的备份数组。(类似于getChars()
对于String
,StringBuffer
,等等)这都是关于维护抽象边界的,这样on类就不会“破坏”另一个抽象边界其中,只有3例是严格强制克隆的。在2、4和5中,您可能会认为这是一个如何为类、库和应用程序设计公共(或内部)API的问题。通常有很多可行的选择。对不起,但是“是否会超出预算”显然是“给我你的意见”的大概意思。从这个意义上说,你的问题不适合这里。我的意见是:这要看情况而定。如果您的设计效果更好,如果您返回副本,那么就这样做。如果各方都在处理相同的对象这一点很重要,那么也许你不需要创建克隆。半相关:@StephenC如果你能给出一些在可变对象的getter中需要克隆对象的例子,那就太好了