首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java复制剪辑

Java复制剪辑
EN

Stack Overflow用户
提问于 2019-03-26 14:37:10
回答 2查看 199关注 0票数 1

我发现了许多建议和讨论克隆的话题,但我一直无法真正实现一个可以复制我的剪辑对象的方法。

以下是我尝试过的方法:

代码语言:javascript
复制
// ... setting up class ...

MyClip GunClip = new MyClip();

GunClip.set(AudioSystem.getClip());

AudioInputStream inputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(getClass().getResourceAsStream("/Resources/sound/Laser.wav")));

GunClip.dummy.open(inputStream);
// ...

然后,当事件被触发时,我想重复播放该声音。所以我试着复制它:

代码语言:javascript
复制
class MyClip implements Cloneable {

    Clip dummy;

    public MyClip() {

    }

    public Clip get() {
        return dummy;
    }

    public void set(Clip c) {
        this.dummy = c;
    }

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

}

我按照this主题中的建议实现了Cloneable类。

然后我在播放之前克隆它:

代码语言:javascript
复制
MyClip c = (MyClip) GunClip.clone();

c.dummy.setFramePosition(0);
c.dummy.start();

但即使是现在它也不起作用。

编辑:我已经弄明白为什么它不工作了,这是因为它不是深度克隆,并且原始GunClip正在使用的InputStream没有被克隆。但是由于Clip是一个抽象的接口,所以克隆它可能会比正常情况下更难。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-26 15:19:32

代码语言:javascript
复制
class MyClip implements Cloneable {

    Clip dummy;

    public MyClip() {

    }

    public Clip get() {
        return dummy;
    }

    public void set(Clip c) {
        this.dummy = c;
    }

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

如果你像这样写代码,你基本上就是在说“Object类知道关于我的自定义类的一切,包括如何构建它”。当然不是这样的。

您需要根据自己的需要调整clone方法:

代码语言:javascript
复制
class MyClip implements Cloneable {

    Clip dummy;

    public MyClip() {

    }

    public Clip get() {
        return dummy;
    }

    public void set(Clip c) {
        this.dummy = c;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        MyClip clone = new MyClip(); // create a new instance of your class
        clone.set(this.dummy);       // make sure it has the same value for 'dummy'
                                     // I would suggest improvement on your setter and getter name, though
        return clone;  // This returns an instance of MyClip, which has the exact same
                       // state as your current, but is a clone, and not the same instance.
    }

}

为了调用它,你需要类似这样的东西:

代码语言:javascript
复制
public void getClone(MyClip original) {
  MyClip Clone = (MyClip)original.clone();
}

编辑:根据你的问题,原始文件的“虚拟”也被感染了,如果你想防止这种情况,只需要让你的Clip类也实现Cloneable,并将你的克隆方法变成这样:

代码语言:javascript
复制
@Override
        protected Object clone() throws CloneNotSupportedException {
            MyClip clone = new MyClip(); 
            clone.set(this.dummy == null ? null : this.dummy.clone());     
            return clone;                            
        }
票数 2
EN

Stack Overflow用户

发布于 2019-03-26 15:32:15

我喜欢在我的对象中编写一个复制构造函数。这为我提供了一种克隆对象的方法,而不必强制转换结果。您可以使用该构造函数以一种干净的方式实现Cloneable,因此仍然可以让您的对象支持该接口。这就是我的意思,包括用这两种方法克隆对象的示例代码:

代码语言:javascript
复制
static class MyClip implements Cloneable {

    Clip dummy;

    public MyClip() {

    }

    public MyClip(MyClip toCopy) {
        dummy = toCopy.dummy;
    }

    public Clip get() {
        return dummy;
    }

    public void set(Clip c) {
        this.dummy = c;
    }

    @Override
    public Object clone() {
        return new MyClip(this);
    }

}

public static void main(String... args) {
    MyClip original = new MyClip();
    MyClip clone1 = (MyClip)original.clone();
    MyClip clone2 = new MyClip(original);
}

有关编写复制构造函数来复制对象的另一个好处是,有一种让您的超类参与复制操作的自然方法,首先使用'super(toCopy);‘调用它的复制构造函数,然后复制您自己的子类中的字段。这在这里不适用,因为您正在实现一个接口,但是如果您正在扩展另一个类,则这一点很重要。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55351126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档