我正在阅读正确执行数组的深层拷贝,但是我对#clone()的实现感到困惑.它是 java.lang.Object类的成员,但如果您读取了javadocs:

First,if the class of this object does not implement the interface Cloneable,then a CloneNotSupportedException is thrown.

那么为什么要在那里定义克隆方法呢?当然如果一个方法只能在接口存在的时候使用,那么你可以将该方法放在接口中.可克隆的界面本身是空的它只是Java使用的标记界面,以确保使用克隆方法是合法的.

这样做也可以消除使用仿制药来确保类型安全的能力:

class Foo implements Cloneable { // Valid.
    @Override
    public Object clone() throws CloneNotSupportedException {
        // ...
    }
}

class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
    @Override
    public TypeSafeFoo clone() throws CloneNotSupportedException {
        // ...
    }
}

为什么Java这样做呢?我确定他们有合理的理由,但我似乎无法弄清楚.

解决方法

Java中的克隆合同规定每个克隆实现必须首先从super.clone()获取克隆的实例.这将创建一个永远以Object.clone调用结束的链,并且该方法包含“神奇”本机级代码,该代码构成了表示Java对象的底层原始结构体的二进制副本.如果此机制不存在,则克隆将不能是多态的:Object.clone方法会生成任何调用的类的实例;这不能没有本地代码复制.

这就是为什么不能避免Object.clone方法的原因.可克隆可能包含一个克隆方法,但它会产生关于throws子句的问题.它的方式可以自由地声明克隆,没有声明的例外,或声明任意异常.如果方法已经在接口中声明,那么这种灵活性是不可能的.

请记住,泛型对克隆没有什么用处:想象在对象中保护T克隆():T将来自哪里?我们需要Object< T>并强制Java Universe中的每一个类都可以自己进行参数化,这一切只是为了使这种半被淘汰的机制更好一些?还要记住,这段代码完全合法:

public class TheMightyOne implements Cloneable {
   @Override public TheMightyOne clone() {
     return (TheMightyOne) super.clone();
   }
}

你可以称之为:

TheMightyOne one = new TheMightyOne();
TheMightyOne two = one.clone(); // do downcasts needed

java – 为什么#clone()不在Cloneable界面?的更多相关文章

  1. ios – 如何使用string中的参数创建Selector

    我正在使用Swift3.1和Xcode8.3.3编写程序.我想创建一个类,负责在键盘出现和消失时移动整个视图.但是我在使用字符串参数创建自定义选择器时遇到了困难.要显示或隐藏键盘我们需要功能:我正在尝试创建一个这样的选择器:它正在编译,但是当键盘出现时,它会崩溃.因为它是独立的类我不能使用这种结构:因为它将Swift函数转换为Objective-C函数.所以问题是:如何用参数字符串创建一个Selector表单?

  2. ios – 为什么,将nil作为参数从Objc C发送到swift类初始化器,用新对象替换nil参数

    除非属性本身被声明为nonnull:

  3. ios – 如何为NSNotification编写单元测试

    我在swift工作,我想刷新一个页面,所以我使用通知发送它,我在一个ViewController中发布通知并在另一个中添加观察者,它工作正常.我想要做的是在swift中添加单元测试.我查了很多网站但是没能做到.我是新手,不知道从哪里开始.基本上工作是,当我点击按钮通知被发布时,并且当加载下一个视图控制器时,添加通知观察者.我该怎么做单元测试提前致谢编辑:码并添加观察者解决方法一般的解决方案是:使用

  4. iOS 6 javascript与object.defineProperty的间歇性问题

    当访问使用较新的Object.defineProperty语法定义属性的对象的属性时,有没有其他人注意到新iOS6javascript引擎中的间歇性错误/问题?https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty我正在看到javascript失败的情况,说

  5. ios – NSNotificationCenter多次呼叫

    我在我的应用程序中实现了NSNotificationCenter.我在完成图像解码时发送通知.第一次图像解码将完成8次.所以通知假设发送8次.但它调用64次(8*8).这是我的代码我是如何实现的–>//初始化//调用方法//解除分配//发布通知有人可以建议我做错了.提前致谢.//调用方法是这样的(调用8次)解决方法解:我重新检查了我的代码,initWithFrame:(CGRect)框架调用了8次

  6. ios – 使用NSMutableAttributedStrings快速更改文本颜色

    我有一个UITableView,我想在同一行中使用不同的颜色显示每行的文本.我试过这个代码,尝试从Obj-C翻译,但我不能让它工作这一切的输出是其中数字34对应于object.valueForKey!.description)被替换为{.如果我留下关于NSAttributedString的这段代码,行文本会正确显示.解决方法我认为问题可能在于分配给cell.textLabel?.attributedText.也许是这样的:不确定你是否希望字符串的第二部分是红色或其他颜色,所以我把它变黑了.

  7. Xcode / iOS:如何隐藏Navigation-和ToolBar向下滚动?

    我想在iPhone上隐藏两个滚动条.当我向上滚动时,他们应该再次出现..我该如何处理?

  8. ios – 将阵列存储在Realm对象中

    我是Swift的新星.有没有办法在RealmObject中存储字符串数组?我有一个JSON对象像:如何将消息数组存储在权限密钥中?

  9. xcode – 使用performSelector执行的方法中的objc_retain中的崩溃

    我有这个奇怪的崩溃与ARC自动插入objc_retains在我的代码.我有以下两个类:在某些时候,我实例化一个MenuItem:然后在其他地方,我在菜单项上调用performAction:在执行某些方法我遇到崩溃:为什么会这样?

  10. ios – “点击恢复”暂停文本SpriteKit

    我知道当应用程序进入非活动状态时,SpriteKit已处理暂停游戏,但我正在尝试做的是在应用程序重新进入活动状态时添加SKLabelNode“点击以恢复”.现在它正在调用我的函数并暂停游戏,但文本没有显示.AppDelegate.swiftGameScene.swift编辑:下面是我的终端输出的屏幕截图,其中包含我对上述代码的最新修改:解决方法所以我在这里“破解”了我的解决方案.感谢ABakerS

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部