【问题标题】:What does Joshua Bloch mean by extra-linguistic?Joshua Bloch 所说的超语言是什么意思?
【发布时间】:2013-03-08 17:08:17
【问题描述】:

来自Artima article on clone vs copy constructor

Object 的克隆方法非常棘手。它基于现场副本,并且 它是“语言外的”。它创建一个对象而不调用 构造函数。不能保证它保留不变量 由建设者建立。已经有很多错误了 年,无论是在太阳内外,都源于这样一个事实,如果你 只需重复调用 super.clone 直到你克隆了一个 对象,你有一个对象的浅拷贝。

Joshua Bloch 所说的外语是什么意思?

【问题讨论】:

  • 我猜他的意思是它超出了 Java 语言中通常为对象实例化建立的规则 - id est,调用对象的构造函数。
  • @Geek +1,你从Effective java by Joushua Bloch 的书中提出了很多有趣的问题,尤其是关于泛型的问题.. :)
  • @PermGenError 我希望我提出的问题也能对其他人有所帮助。 Stackoverflow 真是太棒了。
  • “外语”一词是外语。
  • 写拉丁文的主要原因之一是听起来很聪明,尽管您不确定自己在说什么,并暗中希望您的听众不会理解这个问题并且他们害怕承认他们没有。

标签: java clone effective-java


【解决方案1】:

他的意思是“Java 范围之外”。

特别是在 Java 中,创建新对象的“正确”方法是使用该对象的构造函数。许多类编写者在他们的构造函数中依赖这个假设和代码逻辑——比如输入验证或你想在构造时保证的任何其他东西——这就是他所说的“构造函数建立的不变量”。但是克隆绕过了这个基本约束,并在不调用构造函数的情况下创建了一个内存副本——因此它是“额外的语言”。

从技术上讲,序列化也是如此。

【讨论】:

  • 那么对象克隆的有效用例是什么?
  • @Pacerier - 在您自己的项目中,您可以完全控制代码克隆是 100% 有效的,尽管有些人更喜欢复制构造函数。只有当您不再控制所有代码并且可能遇到其他开发人员做出的不同假设时,它才会成为一个问题——比如如果您正在编写一个库。
【解决方案2】:

可能是因为它没有在 Java 中实现,但它在 Object 类中有一个原生的。

【讨论】:

  • 考虑到上下文,这不太可能是他的意思。
【解决方案3】:

语言外的对象创建机制(意味着调用或链接构造函数除外)是:

  1. 克隆
  2. 序列化
  3. 反思
  4. btye 代码生成

【讨论】:

    猜你喜欢
    • 2011-05-05
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2012-12-30
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多