【问题标题】:Java variable aliasing workaroundJava 变量别名解决方法
【发布时间】:2009-04-25 19:40:22
【问题描述】:

我最近迁移到 Java,但在变量别名方面遇到了一些问题。我到处搜索,但我似乎找不到将一个对象的内容复制到另一个对象的正确方法,而不仅仅是引用同一个对象。有人有什么建议吗?

编辑:如果我遇到别名问题的 int 怎么办?我应该首先避免这种情况吗?如果有,怎么做?

【问题讨论】:

  • 你能在代码中发表一两行你的意思吗?我不能 100% 确定您要说的是“将一个对象的内容复制到另一个对象而不只是引用同一个对象”。
  • 什么语言使用术语别名?我认为对同一个对象的两个引用作为别名。然而,一个对象的深层克隆提供了一个全新的对象,它实际上并没有引用第一个对象——那么它是如何成为别名的呢?

标签: java object reference alias


【解决方案1】:

如果您的类实现了Clonable 接口,那么您可以使用Object.clone() 方法创建一个硬拷贝。 Wikipedia 条目有一些很好的细节。

另一种方法是使用copy constructors,根据this page,它更安全。

【讨论】:

  • 与 mihi 的答案一样有用,但我喜欢这个链接上的所有有用链接。如果需要,这些链接为我提供了查找更多信息的方法。无论如何,我实现了某种复制构造函数。
  • 克隆非常危险。它执行“按位”复制,这几乎不是您想要的。虽然您可以在某种程度上插入更正代码,但您可能会不时悄悄地把它搞砸。它也不适合继承。
【解决方案2】:

这取决于“内容”。例如,您不能只复制一个 FileInputStream,然后假设两者都将继续从同一个文件加载。

基本上有两种方法:如果类支持“Cloneable”接口,可以通过调用clone()进行克隆。如果没有,它通常有一个复制构造函数,从另一个对象复制数据。

通常,您最终会得到一个浅拷贝(即类的所有字段都被复制,但它们指向同一个对象)。

另一方面,很多对象都被设计成不可变的(比如 String 类),因此不需要复制这样的对象,因为它无论如何都无法更改。

【讨论】:

  • 我怀疑你可以继承 FileInputStream 并实现 Cloneable,克隆会正常工作。也许有点奇怪,但我认为它实际上会给你两个流对象到同一个 FileDescriptor(最近没有检查源)。
【解决方案3】:

另一种选择是设计你的类来创建不可变对象:
http://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html

这避免了克隆或复制构造函数的需要,因为对象一旦创建就无法更改。所以多个变量可以指向同一个对象,但是没有一个可以改变对象的状态。

【讨论】:

    【解决方案4】:

    java.lang.Cloneable 就是你要找的。​​p>

    【讨论】:

      【解决方案5】:

      在 Java 中不能有对引用的隐式引用,因此不能给变量取别名。

      也许如果你解释你想要达到的目标,我们可以在没有“别名”的情况下帮助做到这一点

      编辑:您确实需要通过别名 int 值来解释您的意思。 int 值在运行时是匿名的,因此给它起别名没有任何意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多