2012-04-27 5 views
2

Прежде чем я разместил это, я прочитал некоторые из предыдущих сообщений, и я действительно ничего не вижу в своей логике. (Я уже 3 часа на этом и, вероятно, собираюсь убить свой счастливый час) * Я никогда не хочу знать ответы, мне очень нравится работать, поэтому, возможно, кто-нибудь может задать мне вопрос о том, что я пытаюсь это может заставить меня думать об ответе, используя ваши подсказки или подсказки. Это будет оценено. * obj2 не клонирует так за исключение stackTrace, я обнаружил, что в одной строке есть исключение nullpointer, что означает, что obj2 никогда не клонируется. Пожалуйста, помогите мне подумать немного сложнее.Нужна помощь с моей логикой при клонировании объекта

package testbankaccount; 

/** 
* 
* @author 
*/ 
public interface Cloneable { 

} 

Мой родительский класс

package testbankaccount; 

/** 
* 
* @author 
*/ 
public abstract class BankAccount implements Cloneable, Comparable { 
    private double balance; 
    private int numberofDeposits; 
    private int numberofWithdrawals; 
    private double annualInterestRate; 
    private double monthlyServiceCharges; 
    private String customerName; 



protected BankAccount(){ 
    this(1.0, 1.0); 
} 

protected BankAccount(double balance, double annualInterestRate){ 
    this.balance = balance; 
    this.annualInterestRate = annualInterestRate; 
} 

public void deposit(double deposit){ 
    balance += deposit; 
    numberofDeposits++; 
} 

public void withdraw(double withdrawal){ 
    balance -= withdrawal; 
    numberofWithdrawals++; 
} 

public void calcInterest(){ 
    double monthlyInterestRate = annualInterestRate/1200; 
    double monthlyInterest = balance * monthlyInterestRate; 
    balance += monthlyInterest; 
} 

public void setMonthlyServiceCharge(double serviceCharge){ 
    monthlyServiceCharges = serviceCharge; 
} 

public void monthlyProcess(){ 
    balance -= monthlyServiceCharges; 
    calcInterest(); 
    numberofWithdrawals = 0; 
    numberofDeposits = 0; 
    monthlyServiceCharges = 0.0; 
} 
public void setBalance(double balance){ 
    this.balance = balance; 
} 

public double getBalance(){ 
    return balance; 
} 

public int getNumberWithdraws(){ 
    return numberofWithdrawals; 
} 

@Override 
    public Object clone() throws CloneNotSupportedException { 

     return super.clone(); 

     } 



    @Override 
public abstract String toString(); 

    @Override 
public abstract boolean equals(Object obj); 

} 

Мой подкласс

package testbankaccount; 

/** 
* 
* @author Darren Wright 
*/ 
public class SavingsAccount extends BankAccount implements Cloneable, Comparable { 

private boolean status; 


public SavingsAccount(){ 
    this(1.0,1.0); 
} 

public SavingsAccount(double balance, double annualInterestRate){ 
    super(balance,annualInterestRate); 

} 

public void setActivity(){ 
    if (getBalance() > 25.0) 
    status = true; 
    else status = false; 
} 

    @Override 
public void withdraw(double withdrawal){ 
    if (status = true) 
    super.withdraw(withdrawal);  
} 

@Override 
public void deposit(double deposit){ 
    if (status = false && (deposit + getBalance()) > 25.0) 
    { 
      status = true; 
      super.deposit(deposit); 
    } 
    else if (status = true) 
      super.deposit(deposit); 
} 

    @Override 
public void monthlyProcess(){ 
     double result = 0.0; 
     if(getNumberWithdraws() >4) 
     result = getNumberWithdraws() - 4; 
     setMonthlyServiceCharge(result); 
     setActivity(); 
} 
@Override 
    public String toString() { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

@Override 
    public Object clone() throws CloneNotSupportedException { 

     return super.clone(); 

     } 

    @Override 
    public boolean equals(Object obj) { 
     return (getBalance() == ((SavingsAccount)obj).getBalance()); 
    } 


    public int compareTo(Object obj) { 
    if (getBalance() > ((SavingsAccount)obj).getBalance()) 
     return 1; 
    else if (getBalance() < ((SavingsAccount)obj).getBalance()) 
     return -1; 
    else 
     return 0; 
    } 


} 

Мой тестовый класс

package testbankaccount; 

/** 
* 
* @author 
*/ 
public class TestBankAccount{ 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws CloneNotSupportedException { 
     SavingsAccount obj1 = new SavingsAccount(500,8.25); 
     try{ 
      SavingsAccount obj2 = (SavingsAccount)obj1.clone(); 
      System.out.println(obj1.compareTo(obj2)); 
      System.out.println(obj1.equals(obj2)); 
     } 
     catch (CloneNotSupportedException ex) { 
      ex.printStackTrace(); 
     } 

    } 
} 

Моя ошибка выхода

java.lang.CloneNotSupportedException: testbankaccount.SavingsAccount 
    at java.lang.Object.clone(Native Method) 
    at testbankaccount.BankAccount.clone(BankAccount.java:69) 
    at testbankaccount.SavingsAccount.clone(SavingsAccount.java:60) 
    at testbankaccount.TestBankAccount.main(TestBankAccount.java:16) 
BUILD SUCCESSFUL (total time: 0 seconds) 

Что мне не хватает в процессе моей мысли? Я создал интерфейс, я его реализовал и переоценил в своем супер и подклассе. Мой подкласс ссылается на super.clone() на суперкласс и super.clone() в суперклассе, о котором я думаю, относится к методу клонирования объекта. Я правильно набрал в тестовом классе, но obj2 заканчивается нулевым как в compareTo, так и, конечно же, равным. О чем я не думаю?

+1

Почему вы создаете свой собственный Cloneable интерфейс, а не используете тот, который является частью основной библиотеки Java? –

+0

реализует java.lang.Cloneable скорее testbankaccount.Cloneable, который вы создали. –

ответ

5

Вы не должны создавать свой собственный интерфейс Cloneable. Вы должны использовать one that's built-in.

+1

+1. Альтернативой является объявление «реализует java.lang.Cloneable» (используя полное имя интерфейса). –

+0

@Ted True. Если у него действительно была причина, по которой он хотел создать свой собственный интерфейс, а совпадение имени было просто совпадением, это заставило бы его работать. Но в этом случае, похоже, у него нет причин создавать такой интерфейс. – Jay

+0

Да. Вот и все. Когда я прочитал из книги о том, как Cloneable был определен, я принял это за то, как он должен быть реализован. Это случай, когда я читаю, но не полностью поглощаю. Всем спасибо. Извините, что потратил ваше время. – Addy75

1

Не создавайте свой собственный открытый интерфейс Cloneable. Теперь вы получаете тот, который вы определили, а не системный. Поэтому вместо реализации «реального» Cloneable вы реализуете свой собственный, который функция Object.clone тогда не распознает как делает объект клонированным.

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

Java делает серьезной болью, чтобы сделать объект клонированным, по причинам, которые я не понимаю.