【问题标题】:Implementing the Cloneable Interface实现可克隆接口
【发布时间】:2023-03-15 09:27:01
【问题描述】:

请注意: 我之前创建了一个帖子,其中包含这个问题以及其他几个问题,但被告知由于我在同一个帖子中问了这么多问题,最好将其分解为单独的问题。所以请不要将此标记为重复,是的,说明是相同的,是的,正在使用相同的代码,但问题本身是不同的。谢谢。

我正在使用以下说明开发一个程序:

编写一个名为 Octagon 的类,该类扩展 GeometricObject 并实现 Comparable 和 Cloneable 接口。假设八边形的所有 8 个边的大小相等。面积可以使用以下公式计算

area = (2 + 4/square root of 2) * side * side 

编写一个程序(驱动程序)从文件中读取一系列值,显示面积和周长,创建一个克隆并比较对象及其克隆(基于面积)。此外,您的程序应该将当前对象(刚刚读入)与读入的第一个对象进行比较。当从文件中读取一个负数时,程序结束。

这是我到目前为止的代码,这是我的 GeometricObject 类:

public abstract class GeometricObject {

    public abstract double getArea();
    public abstract double getPerimeter(); 
}

我的八角班:

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {

    private double side;

    public Octagon() {
    }

    public Octagon(double side) {
        this.side = side;
    }

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }

    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }

    public double getPerimeter() {
        return side * 8;
    }

    public String toString() {
        return "Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " +  "\nFirst Compare: ";
    }

    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    @Override 
    public Octagon clone() {
        return new Octagon(this.side);
    } 
}

还有我的 Driver 或 tester 类:(这是我最需要帮助的地方):

import java.util.*;

public class Driver {
    public static void main(String[] args) throws Exception {
        java.io.File file = new java.io.File("prog7.dat");
        Scanner fin = new Scanner(file);
        Octagon first = null;
        int i = 1;
        Octagon older;

        while(fin.hasNext())
        {
            double side = fin.nextDouble();
            if(side < 0.0)
                break;
            Octagon oct = new Octagon(side);
            System.out.print("Octagon " + i + ": \"" + oct.toString() + "\"");
            if (first == null) {
                first = oct;
                System.out.print("Equal");
            }
            else {
                int comparison = oct.compareTo(first);
                if (comparison < 0)
                    System.out.print("less than first");
                else if (comparison > 0)
                    System.out.print("greater than first");
                else 
                    System.out.print("equal");
            }
            String cloneComparison = "Clone Compare: ";
            older = oct;
            Octagon clone = oct.clone();
            if ( older.getArea() == clone.getArea() ){
                cloneComparison = cloneComparison + "Equal";
            } else {
                cloneComparison = cloneComparison + "Not Equal";
            }
            //System.out.println(cloneComparison);
            i++; 
            first = new Octagon(side);
            System.out.println();
        }
        fin.close();
    }
}

这是用于获取输入的文件。每行是一个八边形:

5.0
7.5
3.26
0.0
-1.0

我很难弄清楚如何实现可克隆接口,以便在我打印结果时,他们会说克隆比较:相等(或不相等)。

非常感谢任何输入。

【问题讨论】:

  • 为什么要比较面积?只是比较侧面。面积是使用 sqrt(2) 计算的双精度,考虑到浮点错误,您不能只比较它...
  • 因为这就是指示所说的。
  • 你真的是指Cloneable吗?可能你需要Comparable?
  • 是的,我也在使用 Comparable,但也需要使用 Cloneable(我们应该对读入的每个对象进行克隆并将其与该对象的原始对象进行比较)。
  • 如果你不调用Object.clone(),你是否实现Cloneable没有区别。

标签: java interface cloneable


【解决方案1】:

我要做的是首先通过创建具有相同边长的八边形来实现方法Octagon.clone()

Public Octagon clone(){
    return new Octagon(this.side);
}

在 Driver 中克隆您新创建的 Octagon 并将两者(旧的和新的)与以下内容进行比较:

String cloneComparison = "Clone Comparision: ";
if ( older.getArea() == newer.getArea() ){
    cloneComparison = cloneComparison + "Equal";
} else {
    cloneComparison = cloneComparison + "Not Equal";
}
System.println(cloneComparison);

这也会根据结果返回正确的字符串。

【讨论】:

  • 在 Octagon.clone() 部分,除了我已经拥有的“@Override Octagon clone() { ...”之外,这是否是另一种方法,或者只是更改现有代码中的代码方法是 this.getSide() 而不是现在写的 this.side?​​span>
  • @Beth 你已经做的很好:this.side vs this.getSide() 真的无关紧要。我不清楚你的实际问题是什么。
  • 哦,好吧,只是想确定一下,就像我说的我以前从未使用过它,所以我还在学习一切是如何工作的。
  • @BethTanner 如果你已经有一个 Octagon.clone() 方法,你应该可以看看它是否有效。 This.side 实际上是检索字段的更好方法 - 我将更改我的答案以反映这一点
  • older 和 newer 只是代表旧(原始)和新(克隆)八边形的变量。较旧的 Octagon 将是您的 oct 变量,而较新的(我们将在此处称为 clone)需要通过克隆它来创建:Octagon clone = oct.clone(); 一旦你有你都应该能够对它们进行比较。
猜你喜欢
  • 2016-06-27
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多