2013-11-10 1 views
2

Вот моя программа. Где бы то ни было this.pizzaorder[i].clone() или this.pizzaorder[count].clone(), я получаю сообщение об ошибке, что 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; 
} 
} 
+0

Я добавил это в свою программу public Object clone() { try { return super.clone(); } catch (Исключение e) { return null; }} Но до сих пор он не работает :( – user2975261

+0

BYW, у вас есть опечатка выше: 'this.pizzaorder [я] = this.pizzaorder [я] .clone()' должен быть 'this.pizzaorder [ i] = keep.pizzaorder [i] .clone(); ' –

ответ

0

Чтобы клонировать класс вам нужно переопределить метод() клон, и вам необходимо поместить код там, что создает новый экземпляр вашего класса и копирует переменные-члены другого класса к нему, и верните новый экземпляр.

1

Ваша первоначальная проблема заключается в том, что вам нужно объявить метод клонирования public в вашем классе, если вы хотите, чтобы клон был общедоступным.

Но просто делать этого не достаточно:

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

Есть две проблемы с этим. Во-первых, улавливание исключений и возвращение nullнарушает договор о том, как должен вести себя clone(). Прочтите javadoc для Object.clone(), чтобы понять, как он должен себя вести. Нет оправданий при возврате null в случае сбоя. Вы должны выбросить исключение или разрешить распространение существующего.

И причина, по которой вы получаете исключение, - также, объясненный javadoc. Вы полагаетесь на собственный механизм клонирования Object. Но этот механизм работает только в том случае, если класс, который вы пытаетесь клонировать, реализует интерфейс маркера Cloneable. Если это не так, то вызов super.clone() поднимет CloneNotSupportedException.


Наконец, я хотел бы указать, что вам нужно быть осторожным с клонированием. С одной стороны, это может быть дорого. С другой стороны, клонирование с использованием собственного механизма клона не всегда делает «правильную вещь» для вашего приложения. Этот механизм дает вам только мелкую копию; то есть он не создает копию «компонентных» объектов объекта, который вы клонируете.

0

Я бы рекомендовал не использовать 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]); 

ИМХО, это чище и проще понять.

Смежные вопросы