标签: cloneable

关于java中的可克隆接口和object.clone()的困惑

如果我有:

class foo implements Cloneable
Run Code Online (Sandbox Code Playgroud)

然后做:

bar = new foo();
bar.clone();
Run Code Online (Sandbox Code Playgroud)

我得到一个浅拷贝而不需要编写任何bar.clone()代码,就像我通常在实现接口时需要做的那样.

我的理解是接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,"类对象本身不实现接口Cloneable")

那么我的浅层克隆来自哪里?bar.clone()如果Object.clone()没有实现,那么实现的代码在哪里?我糊涂了.

java cloneable

17
推荐指数
2
解决办法
2万
查看次数

Java中的可序列化,可复制和内存使用

我正在使用一个内部类,它是HashMap的子类.我有一个String关键和double[]价值观.我每次存储约200个双打double[].我应该使用大约700 MB来存储密钥,指针和双打.然而,内存分析显示我需要更多(略多于2 GB).

使用TIJmp(分析工具)我看到有一个char[]使用了几乎一半的总内存.TIJmp表示char[]来自SerializableCloneable.其中的值范围从字体列表和消息和单个字符的默认路径.

SerializableJVM中的确切行为是什么?它是否始终保持"持久"副本,从而使我的内存占用量增加一倍?如何在运行时编写对象的二进制副本而无需将JVM转换为内存占用?

PS:内存消耗增加最多的方法是下面的方法.该文件每行大约有229,000行和202个字段.

public void readThetas(String filename) throws Exception
{
    long t1 = System.currentTimeMillis();
    documents = new HashMapX<String,double[]>(); //Document names to indices.
    Scanner s = new Scanner(new File(filename));
    int docIndex = 0;
    if (s.hasNextLine())
        System.out.println(s.nextLine()); // Consume useless first line :)
    while(s.hasNextLine())
    {
        String[] fields = s.nextLine().split("\\s+");
        String docName = fields[1];
        numTopics = fields.length/2-1;
        double[] thetas = new double[numTopics];
        for …
Run Code Online (Sandbox Code Playgroud)

java memory heap serializable cloneable

14
推荐指数
2
解决办法
2280
查看次数

如何在Java中复制队列?

我有一个Queueq1,我想创建一个QueueQueueq1 相同的q2.如何做到这一点,因为Queue没有实现Cloneable.

java queue clone cloneable

14
推荐指数
2
解决办法
2万
查看次数

What is this field-by-field copy done by Object.clone()?

In Effective Java, the author states that:

If a class implements Cloneable, Object's clone method returns a field-by-field copy of the object; otherwise it throws CloneNotSupportedException.

What I'd like to know is what he means with field-by-field copy. Does it mean that if the class has X bytes in memory, it will just copy that piece of memory? If yes, then can I assume all value types of the original class will be copied to the new object?

class Point …
Run Code Online (Sandbox Code Playgroud)

java clone cloneable

12
推荐指数
1
解决办法
4260
查看次数

为什么Object clone()方法仅适用于实现Cloneable接口的类?

我知道这clone()是一个受保护的方法,但"受保护"意味着它可以被特定类的所有子类访问.

任何Java类都是其子类Object,那么受保护方法的原因是什么?

为什么我们clone()只能调用实现Cloneable接口的类?我不明白它是如何连接到一个事实,clone()Object为受保护声明.

java object cloneable

12
推荐指数
2
解决办法
2万
查看次数

Java中的Prototype Pattern - clone()方法

所以,我一直在阅读设计模式,原型模式让我困惑.我相信使用它的一个要点是避免使用new运算符.然后我看看这个例子:

http://sourcemaking.com/design_patterns/prototype/java/1

首先,他们对Prototype的想法实现了一个clone()方法,这很奇怪.维基百科还说我需要一个纯子方法克隆来实现子类(为什么?).Java是否已经提供了这样的方法,正是我们需要它做的事情(这是创建一个对象的副本而不是从头开始实例化)?其次,clone方法调用new new!当然这个例子是错的?(在这种情况下,我应该在其他地方学习设计模式,嘿?).有人能说出这种纠正是否正确吗?:

static class Tom implements Cloneable implements Xyz {
    public Xyz    cloan()    {
      return Tom.clone(); //instead of new I use clone() from Interface Cloneable
    }
    public String toString() {
      return "ttt";
    }
  } 
Run Code Online (Sandbox Code Playgroud)

任何澄清表示赞赏.

java design-patterns clone cloneable prototype-pattern

11
推荐指数
1
解决办法
1万
查看次数

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

Cloneable在Java中本质上是破碎的.具体来说,我对界面的最大问题是它需要一种不定义方法本身的方法行为.因此,如果遍历Cloneable列表,则必须使用反射来访问其定义的行为.但是,在Java 8中,我们现在有默认方法,现在我问为什么没有默认clone()方法Cloneable.

我理解为什么接口不能默认Object方法,但是,这是一个明确的设计决策,因此可以做出异常.

我有点想到弃用Object.clone()并将其内部代码更改为:

if(this instanceof Cloneable) {
    return ((Cloneable) this).clone();
}
else {
    throw new CloneNotSupportedException();
}
Run Code Online (Sandbox Code Playgroud)

并继续前进任何魔法使其clone()成为默认方法Cloneable.这并没有真正解决,clone()仍然可以很容易地错误地实现,但这本身就是另一个讨论.

据我所知,这种变化将完全向后兼容:

  1. 当前覆盖clone()但未实现的类Cloneable(为什么?!)在技术上仍然可以(即使在功能上不可能,但这与以前没有什么不同).
  2. 当前覆盖clone()但实现的类Cloneable在其实现上仍将起相同的作用.
  3. 当前没有覆盖clone(),但确实实现Cloneable(为什么?!)的类现在将遵循规范,即使它在功能上并不完全正确.
  4. 使用反射并提到的那些Object.clone()仍然可以在功能上工作.
  5. super.clone()即使它正在引用,它在功能上仍然是相同的Object.clone().

更不用说这将解决一个巨大的问题Cloneable.虽然繁琐且仍然容易错误地实现,但它将解决界面的巨大面向对象问题.

我能看到的唯一问题是那些实现Cloneable没有义务覆盖的问题clone(),但这与以前没有什么不同.

这已在内部进行过讨论,但从未取得成果吗?如果是这样,为什么?如果是因为接口不能默认使用Object方法,那么在这种情况下做出异常是否有意义,因为所有继承Cloneable的对象都是期待clone()的?

java clone cloneable java-8 default-method

11
推荐指数
2
解决办法
7372
查看次数

克隆整数

我试图克隆类Integer的对象,它实现了可克隆的接口.

Integer a = new Integer(4);  
Integer b = a.clone();
Run Code Online (Sandbox Code Playgroud)

我知道有这方面的工作,但我必须像这样实现它.为什么我收到此错误= clone()已保护访问权限java.lang.Object

为什么会这样说?clone方法不是clonable接口的公共抽象方法,它与object有什么关系.提前致谢 :-)

java cloneable

8
推荐指数
2
解决办法
2万
查看次数

Java克隆的优点

我一直在网上寻找关于java克隆的教程,但只发现了clone()的缺点,而没有找到优点.我想知道使用Java clone()的一些优点.

java cloneable

8
推荐指数
1
解决办法
4567
查看次数

克隆如何比对象创建具有更多性能

我试图理解java中clone()方法下面发生了什么,我想知道如何做一个新的调用

public class Person implements Cloneable {

    private String firstName;
    private int id;
    private String lastName;

    //constructors, getters and setters

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person p = (Person) super.clone();
        return p;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的克隆代码我想知道底下发生了什么,以及新呼叫之间有什么区别因为.

这是我的客户端代码

    Person p = new Person("John", 1, "Doe");
    Person p2 = null;
    try {
         p2 = (Person) p.clone();
    } catch (CloneNotSupportedException ex) {
        Logger.getLogger(clientPrototype.class.getName()).log(Level.SEVERE, null, ex);
    }
    p2.setFirstName("Jesus");
    System.out.println(p);
    System.out.println(p2);
Run Code Online (Sandbox Code Playgroud)

java performance clone cloneable

8
推荐指数
3
解决办法
6969
查看次数