【问题标题】:Clone() from the type Object is not visible [duplicate]来自 Object 类型的 Clone() 不可见 [重复]
【发布时间】:2013-11-22 00:17:33
【问题描述】:

这是我的程序。只要有this.pizzaorder[i].clone()this.pizzaorder[count].clone(),我就会收到一条错误消息,指出Object 类型中的Clone() 不可见。请帮忙?

import java.text.NumberFormat;
public class PizzaOrder {

NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance();
public int TotalNoOfPizzas, keep;                                             
//declaring the variables needed for this class

public double totalcost;
Pizza[] pizzaorder = new Pizza[TotalNoOfPizzas];
int i;

public PizzaOrder() {                                              
//constructor to initialize all the varibales

    this.TotalNoOfPizzas = 0;
    this.totalcost = 0.0;
    for ( i = 1; i <= pizzaorder.length; i++ ) {
        pizzaorder[i] = null;   }
}

public PizzaOrder( PizzaOrder keep ) {                          
// copy constructor
    for ( i = 1; i <= pizzaorder.length; i++) {
        this.pizzaorder[i] = this.pizzaorder[i].clone();    }
    this.TotalNoOfPizzas = keep.TotalNoOfPizzas;
    this.totalcost = keep.totalcost;    }

public int getTotalNoOfPizzas() {                                       
//using Accessor to get the number of pizzas
    return this.TotalNoOfPizzas; }

public void setTotalNoOfPizzas( int TotalNoOfPizzas1 ) {                
//using mutators to set the number of pizzas
    this.TotalNoOfPizzas = TotalNoOfPizzas1; }

public Pizza getPizza ( int pizzas) {                                       
//using Accessor to get the size and toppings for pizza 1 
    return (this.pizzaorder[pizzas]); } 

public void setPizza(Pizza tempPizza, int count) {
    this.pizzaorder[count].clone(); }       

public double getTotalCost() {
    return(this.totalcost); }

public void setTotalCost(double totalcost1) {
    this.totalcost = totalcost1;    }



public double calcTotal() {                                                                         
//calculating the total cost
double totalcostoford = 0;
for (i = 1; i <= pizzaorder.length; i++) {
    totalcostoford += this.pizzaorder[i].calcCost();    }
return totalcostoford;  }

public String tostring() {
String pizzaDescription;
pizzaDescription = "\n Order No.:" + this.pizzaorder;
pizzaDescription +="\nTotal No. of pizza's ordered:" + TotalNoOfPizzas;
for ( i = 0; i <= pizzaorder.length; i++ ) {
    pizzaDescription += "\n" + i + ". Pizza" +       
pizzaorder[i].getPizzaDescription();  }
pizzaDescription += "\n" + moneyFormatter.format(this.getTotalCost()) + "is your     
 total price.";
return pizzaDescription;
}
}

【问题讨论】:

  • 我将此添加到我的程序中 public Object clone(){ try{ return super.clone(); }catch(Exception e){ return null; } } 但它仍然没有工作:(
  • BYW,上面有错字:this.pizzaorder[i] = this.pizzaorder[i].clone(); 应该是 this.pizzaorder[i] = keep.pizzaorder[i].clone();

标签: java clone


【解决方案1】:

要克隆一个类,您需要重写 clone() 方法,并且您需要将创建类的新实例并将另一个类的成员变量复制到其中的代码放入其中,并返回新的实例。

【讨论】:

    【解决方案2】:

    你最初的问题是,如果你想让克隆公开可见,你需要在你的类中声明一个public克隆方法。

    但仅仅这样做是不够的:

      public Object clone() { 
         try { 
             return super.clone(); 
         } catch (Exception e) { 
             return null; 
         } 
      }
    

    这有两个问题。首先,捕获异常并像这样返回null违反了clone() 的预期行为方式。阅读 Object.clone() 的 javadoc 以了解它的行为方式。如果发生故障,没有理由返回 null。您应该抛出异常,或允许现有的异常传播。

    您遇到异常的原因由 javadoc 解释。您依赖于 Object 的本机克隆机制。但该机制仅在您尝试克隆的类实现 Cloneable 标记接口时才有效。如果没有,则调用super.clone() 将引发CloneNotSupportedException


    最后,我要指出,你需要小心克隆。一方面,它可能很昂贵。另一方面,使用本机克隆机制进行克隆并不总是为您的应用程序做“正确的事情”。这种机制只给你一个浅拷贝;即它不会复制您正在克隆的对象的“组件”对象。

    【讨论】:

      【解决方案3】:

      我建议不要使用clone,而是使用复制构造函数。

      Pizza 类中,添加一个复制构造函数:

      class Pizza {
         private final sometype some field;
         ...
         Pizza(Pizza that) {
             this.somefield = that.somefield;
         }
         ...
      

      然后代替

      this.pizzaorder[i] = keep.pizzaorder[i].clone();
      

      this.pizzaorder[i] = new Pizza(keep.pizzaorder[i]);
      

      恕我直言,这更清晰,更容易理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-06
        • 2013-12-30
        相关资源
        最近更新 更多