Tag: clone

为什么Java枚举不可克隆?

改变问题为时已晚,但更为精确的是问“为什么克隆()不允许单身人士?”。 copy()方法会更方便。 是否有任何理由不能克隆Java中的枚举? 手册说明了这一点 这保证了枚举永远不会被克隆,这是保持其“单身”状态所必需的。 但是返回实例本身也会保留其状态,并且我能够以与其他可克隆对象相同的方式处理关联的枚举。 有人可能会说 [clone]的一般意图是,对于任何对象x,表达式: x.clone() != x将为true,[…] 但对于单身人士来说,我希望x.clone() == x为真。 如果返回实例本身,则单例模式对引用对象是透明的。 那么,当指定了clone()时,为什么不允许克隆枚举或者忘记考虑单例和不可变因素?

如何在最短的时间内在java中克隆输入流

有人能告诉我如何克隆输入流,尽可能少的创建时间? 我需要多次克隆输入流以便多种方法来处理IS。 我尝试了三种方法,因为某种原因,事情不起作用。 方法#1:感谢stackoverflow社区,我发现以下链接很有帮助,并将代码片段合并到我的程序中。 如何克隆InputStream? 但是,使用此代码最多可能需要一分钟(对于10MB文件)来创建克隆的输入流,并且我的程序需要尽可能快。 int read = 0; byte[] bytes = new byte[1024*1024*2]; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((read = is.read(bytes)) != -1) bos.write(bytes,0,read); byte[] ba = bos.toByteArray(); InputStream is1 = new ByteArrayInputStream(ba); InputStream is2 = new ByteArrayInputStream(ba); InputStream is3 = new ByteArrayInputStream(ba); 方法#2:我也尝试使用BufferedInputStream来克隆IS。 这很快(创建时间最慢== 1ms。最快== 0ms)。 但是,在我发送is1进行处理之后,方法处理is2和is3引发了一个错误,说没有什么可以处理,几乎就像下面引用相同的IS的所有3个变量一样。 is = getFileFromBucket(path,filename); … […]

为什么Java 8中的Cloneable中没有默认的clone()

Java中的可Cloneable本质上是破碎的。 具体来说,我对界面的最大问题是它需要一种不定义方法本身的方法行为。 因此,如果遍历Cloneable列表,则必须使用reflection来访问其定义的行为。 但是,在Java 8中,我们现在有了默认方法,现在我问为什么Cloneable没有默认的clone()方法。 我理解为什么接口不能默认Object方法 ,但是,这是一个明确的设计决策,因此可以做出exception。 我有点想象弃用Object.clone()并将其内部代码更改为: if(this instanceof Cloneable) { return ((Cloneable) this).clone(); } else { throw new CloneNotSupportedException(); } 继续使用任何魔法使clone()在Cloneable作为默认方法。 这并没有真正解决clone()仍然可以很容易地被错误地实现,但这本身就是另一个讨论。 据我所知,这种变化将完全向后兼容: 当前覆盖clone()但没有实现Cloneable (WHY ?!)的类在技术上仍然可以接受(即使在function上不可能,但这与以前没有什么不同)。 当前覆盖clone()但实现Cloneable的类在其实现上仍将起相同的作用。 当前没有覆盖clone()但是实现了Cloneable (WHY ?!)的类现在将遵循规范,即使它在function上并不完全正确。 使用reflection并引用Object.clone()那些仍然可以在function上工作。 即使它引用了Object.clone() super.clone()在function上仍然是相同的。 更不用说这将解决Cloneable一个巨大问题。 虽然繁琐且仍然容易错误地实现,但它将解决界面的巨大面向对象问题。 我能看到的唯一问题是那些实现Cloneable人没有义务覆盖clone() ,但这与之前没有什么不同。 这已在内部进行过讨论,但从未取得成果吗? 如果是这样,为什么? 如果是因为接口不能默认使用Object方法,那么在这种情况下做出exception是否有意义,因为inheritanceCloneable所有对象都期待clone() ?

在SimpleDateFormat和克隆上同步

我们知道dateformat类不是线程安全的。 我有一个multithreading场景,需要使用dateformats。 我无法在新线程中创建新实例,因为SimpledateFormat创建似乎很昂贵(构造函数最终调用“compile”,这是昂贵的)。 经过一些测试后,我只剩下两个选项: 外部同步 – 我真的不想这样做 克隆每个线程 – 不知道是否有一些捕获? 有什么建议么? 如果人们之前已经面对过这个问题,你会采取什么方向。 注意 :之前曾问过一个类似的问题 ,但它被关闭指向一个apache包。 我不能为此使用新库。 我也在SO上读过这个类似的问题

复制构造函数创建依赖副本

我实现了这里描述的复制构造函数。 但问题仍然是当我更新route_copy ,相同的更新将应用于route 。 所以,我不明白我的代码有什么问题? public class Route implements Comparable { private List sites; public Route() { sites = new ArrayList(); } public Route(List sites) { this.sites = sites; } /** * Copy constructor */ public Route(Route r) { this(r.sites); } public void deleteSite(Site s) { this.sites.remove(s); } } public processData(Route route) { Route route_copy […]

克隆整个JavaScript ScriptEngine

我需要以某种方式深度克隆我的ScriptEngine对象的整个绑定集。 我试过的 到目前为止,我已经尝试克隆整个Bindings结构的Cloner库 。 如果它有用,那将是很好的,因为它可以确保精确的副本,包括私有变量。 但是这会导致jvm堆损坏(jvm只是崩溃,退出代码为-1073740940)。 有时它不会崩溃,但会发生奇怪的事情,比如System.out.println()停止工作…… 我还研究了使用ScriptEngine中的js代码克隆对象,这样我就可以将它们作为NativeObjects获取并在一些java地图中管理它们。 但是我发现的所有克隆方法都存在缺陷。 我想要一个精确的对象快照。 例如,如果两个对象a和b中的每一个都包含引用相同对象c的字段(例如a.fa和b.fb),则在使用jQuery.extend() (例如)克隆字段a.fa和b.fb克隆的a和b将引用c的不同克隆,而不是引用一个相同的克隆。 还有很多其他边缘问题。 我还尝试使用Cloner克隆整个ScriptEngine(不仅仅是绑定),我还尝试使用Rhino的js引擎并克隆整个范围(而不是Bundeled ScriptEngine包装器)。 但堆腐败问题仍然存在。 为什么我需要这样做 我需要这个,因为我必须能够将整个ScriptEngine绑定的值恢复到之前的某个点。 我需要制作绑定的精确快照。 该应用程序是我的博士研究项目的一部分,该项目包括运行状态机和节点(在java中实现),其中附带了js代码。 js代码由最终用户输入,并且在运行时被逐出。 当无法通过路径到达最终状态时,算法会向后执行步骤,尝试查找备用路径。 在每个步骤向后,它必须撤消js引擎绑定中可能发生的任何更改。 所有全局变量名称在js evaling之前都是已知的,并且是对象(用户在节点的代码中键入,然后将其组织(在java中)到具有特定名称模式的js对象中)。 但是它们的内容可以是任何东西,因为它是由用户js代码控制的。 所以我想我现在唯一的解决方法是使用js代码克隆js对象。

Spring:为每次调用get方法创建bean的新实例

我有下一种情况: Connection manager应该每次都有ConnectionServer一个对象和DataBean新对象所以,我已经创建了这些bean并配置了它spring xml。 <!—-> 并为DataBean添加了范围prototype 在此之后,我创建了名为Test的简单util / component类 @Component public class Test { @Autowired private DataBean bean; @Autowired private ServerCon server; public DataBean getBean() { return bean.clone(); } public ServerCon getServer() { return server; } } 但是,每次调用getBean()方法我都会克隆这个bean,这对我来说是个问题。 我可以在没有克隆方法的情况下从spring配置中执行此操作吗? 谢谢。

如何克隆旧构建器以创建新的构建器对象?

我有一个我正在我的项目中使用的构建器类。 假设我将metricA作为基于以下类的构建器。 我需要通过克隆metricA来制定基于metricA的新构建器metricB ,以便metricB包含metricB中已经存在的所有值。 在MetricHolder的构造函数中,我正在基于已经设置的字段初始化一些字段(不是直接设置)。 clientTypeOrPayId – 我正在初始化此字段。 如果payId存在,那么我将设置此值或我将设置clientType 。 clientKey – 我也在同一个构造函数中初始化这个字段。 最重要的是,我在clientPayload地图中放置了几个必填字段。 我不确定这样做的正确方法是什么。 但我需要在地图中添加is_clientid和is_deviceid 。 (一般来说,我添加了更多的字段)。 然后在构造函数的最后一个,我计算延迟差异并将其发送到其他系统。 以下是我的课程: public final class MetricHolder { private final String clientId; private final String deviceId; private final String payId; private final String clientType; private final String clientTypeOrPayId; private final Schema schema; private final String schemaId; private final […]

如何在Java中创建一个InputStream的深层副本

我想知道如何制作一个InputStream的深层副本。 我知道可以使用IOUtils包完成,但我想尽可能避免使用它们。 有没有人知道另一种方式?

使用复制构造函数而不是Object.clone进行深层复制的正确方法

我有一些代码使用Object.clone执行深层复制,但我正在尝试使用更“可接受”的复制构造函数重写它。 下面是我正在尝试做的两个简单示例,第一个使用克隆,第二个使用复制构造函数。 使用克隆的深层复制 import java.util.*; abstract class Person implements Cloneable { String name; public Object clone() throws CloneNotSupportedException { return super.clone(); } } class Teacher extends Person implements Cloneable { int courses; public String toString() { return name + “: courses=” + courses; } } class Student extends Person implements Cloneable { double gpa; public […]