问题标签 [defensive-copy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - LinkedList 插入绑定到插入的对象
我的代码如下所示:
并且似乎每当我做类似 的事情时term.add(anotherTerm)
, anotherTerm 是......另一个 Term 对象,似乎 anotherTerm 引用的内容与我刚刚插入 term 的内容相同,因此每当我尝试更改 anotherTerm 时,term.get( 2)(比方说)get也变了。
我怎样才能防止这种情况发生?
由于请求了代码:
调用插入方法的代码:
创建 anotherTerm 术语的代码:
调用插入方法的新代码:
clone() has protected access in java.lang.Object
不幸的是,即使在做了之后,它仍然不起作用public class Term implements Cloneable{
java - How do I make defensive copy of an object?
How do I make defensive copies of a Mutable Object which contains a mutable field in an Immutable Object?
#xA;- The MutableObject does not have a constructor that lets me set the field.
- The MutableObject's current state should be captured in the Immutable Object and never changed.
java - 将可变对象封装成只读对象
我目前正在实施迭代求解器,它通过不断改进对特定问题的解决方案的估计来工作。由于解决方案是一组相当大的数据,因此进行了适当的细化。
我已经实现了一个简单的 Observer/Observable 模式,以便能够在迭代发生时观察算法。特别是,求解器提供了一种方法
它返回解决方案的当前估计。然后观察者可以根据当前估计自由地进行一些计算(例如:决定解决方案是否足够好以及是否可以停止迭代)。Foo
是可变的,但是当然,如果观察者修改了解决方案的当前估计,这可能会破坏求解器的迭代。
所以,getCurrentSolution()
真的应该回归防御副本。但这需要时间和内存来解决大问题,所以我想出了另一个想法,即getCurrentSolution()
返回一个 new ReadOnlyFoo(bar)
,其中foo
(可变的)当前解决方案估计值是求解器私有的。这个想法是它ReadOnlyFoo
具有与 几乎相同的接口Foo
,只有可能修改数据的方法被“停用”(它们抛出异常)。下面给出了一些虚拟类的所有细节。
我的问题是:这种方法是好的做法吗?有更好的模式吗?
谢谢!塞巴斯蒂安
c# - 用防御副本交换收藏
这是我在Effective C#书中看到的一个示例:
作者说这将适用于值类型而不是引用类型。我无法理解他的意思。
我想我现在明白了:集合是 ref 类型。“数据字段”的消费者不会记得他们持有堆上旧存储的副本。如果“数据”是值类型 - 消费者(使用数据的其他代码)会记得他们持有数据的深层副本,并会在需要更新时再次请求它。
正确的 ?
java - 日历的防御副本
一直在尝试找到实现制作日历对象的防御性副本的方法的最佳方法。
例如:
在检查空输入并制作副本时,我特别担心线程的交错,或者我是否遗漏了一些非常明显的东西?
java - 如何让 MyBatis 与防御性副本一起工作?
让我们假设这个简单的模式:
MyBatis 中的这个映射:
这是我的用户 bean 的实现:
所以一切都很简单,除了我从我的用户 bean 实现中的角色列表中获取防御性副本。问题是 MyBatis 似乎根本不支持这一点,并且生成的角色列表将为空。如果我不拿这些副本,它会顺利运行,但设计会很糟糕。有没有解决的办法?
java - 关于不可变类防御性复制
我有一个关于创建不可变类的查询。以下是我考虑的几点:
- 使课程最终
- 使所有成员成为最终成员,在静态块中或在构造函数中显式设置它们
- 将所有成员设为私有
- 没有修改状态的方法
- 要非常小心地限制对可变成员组件的访问(记住该字段可能是最终的,但对象仍然可以是可变的。即私有最终日期 imStillMutable) - 请参阅防御性复制或其表亲复制构造函数以获取更多信息。
但是我根本没有完全理解 5 点,您能否建议或给我看一个例子,其中 5 点在那个例子中很清楚?
java - 制作 Set 的一般副本在构造函数中
我没有找到这个特定问题的直接答案,所以......假设类:
我只想要一个副本而不关心集合的确切实现,开销最小,所以基本上是任何内部状态 initialTags 的直接副本。我不能使用clone
,因为 Set 是接口。这是可能的,还是我必须使用类似的东西new HashSet<String>(tags);
,需要对类型做出决定?
假设:设置项目类型被限制为不可变。我可以相信调用者不会传递一个损坏的initialTags
Set 实现,并且我可以相信它有足够好的性能用于此类中的任何内部使用。
我正在考虑尝试反射和克隆(),但这似乎有点脏......
java - 流和进程的防御性副本
我正在Process proc
运行,如果发生错误,我需要销毁并重新创建它。
这是因为通过标准输入向无法解决的进程发送命令时出现问题。
我的解决方法是重置我建立的“连接”(stdin、stdout、stderr)并从新进程中获取新流。当进程结束时,我正在使用线程进行观察。如果发生错误,我会通过退出命令关闭进程并中断导致它最终关闭流的线程。
主线程已经在建立一个新的连接。在重建连接后发送命令时,IOException 状态流已关闭。
有没有办法可以复制旧流以稍后关闭它?我已经尝试过用另一个阅读器包装它,但没有成功。我不确定通过 getXXXStream() 获取进程的流并关闭它们是否足够,因为这不会关闭上面的读者。另外我担心,我可以抓住新进程并关闭它的流。
我不希望它阻止。
编辑:
正如我的第一条评论所述,我立即关闭了流,但问题Process
仍然存在。如果我要等待 1000 毫秒来关闭它并使用新的重新分配 proc,Process
我的线程将使用新的线程运行(例如调用exitValue()
)。
这是我的主题:
建立我的连接的方法(连接+重新连接):
objective-c - 访问器方法中的 Objective-C 防御性复制
来自 Java 背景,我在想办法在 Objective-C 中进行防御性编程时遇到了麻烦。
假设SomeClass是可变的并提供了一个复制方法,这是我用 Java 编写的一段典型代码:
我花了一些时间才弄清楚
在将 setter 的参数分配给 customerList 属性之前,会对其进行复制。让我困惑的是写一个合适的吸气剂。到目前为止,它看起来像这样:
它适用于所有内部方法调用,如 self.customerList = ...,但会将直接指针传递给任何造成安全漏洞的外部调用。我正在考虑提供一个不同的公共 getter 来返回一个副本,但想避免它,因为它需要一个非常规的名称。你会如何处理这种情况?
谢谢你。