2016-11-02 3 views
1

У меня есть драйвер, который действует как мой тестер.Как получить конструктор копии из драйвера

Вот Driver:

public class CustomerTest { 

    private static int customerCounter = 0; 

    public static boolean test1(){ 
     System.out.println("Test1: create a customer"); 
     Customer c = new Customer("Alice", "Smith"); 
     customerCounter++; 
     return c.getName().equals("Alice Smith") && customerCounter == c.getCustomerID(); 
    } 

    public static boolean test2() { 
     System.out.println("Test2: create two customers"); 
     Customer c1 = new Customer("Alice", "Smith"); 
     Customer c2 = new Customer("Bob", "Simpson"); 
     customerCounter += 2; 
     return c1.getName().equals("Alice Smith") && (customerCounter - 1) == c1.getCustomerID() 
      && c2.getName().equals("Bob Simpson") && (customerCounter) == c2.getCustomerID(); 
    } 

    public static boolean test4() { 
     System.out.println("Test4: copy a customer"); 
     Customer c1 = new Customer("Alice", "Smith"); 
     Customer c2 = new Customer("Bob", "Simpson"); 
     c1.copy(c2); 
     customerCounter += 2; 
     return c1.getName().equals("Bob Simpson") && (customerCounter) == c1.getCustomerID() 
      && c2.getName().equals("Bob Simpson") && (customerCounter) == c2.getCustomerID() 
      && c1 != c2; 
    } 
    public static void main(String[] args) { 
     String result = ""; 
     //System.out.print("Test 1: "); 
     result = test1() ? "pass." : "failed."; 
     System.out.println(result); 

     //System.out.print("Test 2: "); 
     result = test2() ? "pass." : "failed."; 
     System.out.println(result); 

     //System.out.print("Test 4: "); 
     result = test4() ? "pass." : "failed."; 
     System.out.println(result); 

Вот код, который я написал до сих пор:

public class Customer { 

    public static final int MAX_ACCOUNTS = 5; 

    private String firstName; 
    private String lastName; 
    private int customerID; 
    private BankAccount[] accounts; 
    private int numAccounts; 
    private static int nextCustomerID = 1; 

    //default constructor 
    public Customer() { 
     firstName = ""; 
     lastName = ""; 
     customerID = nextCustomerID; 
     accounts = null; 
     numAccounts = 0; 
     nextCustomerID++; 

    } 

    //Constructor sets name and initialized values 
    //@param first is the first name 
    //@param last is the last name 
    public Customer (String first, String last) 
    { 
     this.firstName = first; 
     this.lastName = last; 
     this.customerID = nextCustomerID; 
     nextCustomerID++; 



    }  

    public void copy (Customer copyFrom) 
    { 
     Customer aCustomer = new Customer(); 
     aCustomer.firstName = copyFrom.firstName; 
     aCustomer.lastName = copyFrom.lastName; 
     aCustomer.customerID = copyFrom.customerID; 
     aCustomer.accounts = copyFrom.accounts; 
     aCustomer.numAccounts = copyFrom.numAccounts; 
    } 
} 

Мой конструктор копирования не проходит тест драйвера 4. Я не знаю, почему, потому что я копирую все, что вызывается в методе.

+0

test4 чеки if (customerCounter) == c1.getCustomerID() и (customerCounter) == c2.getCustomerID(). Это действительно то, что должно быть? Это означало бы, что у обоих клиентов одинаковый идентификатор, который мне не подходит. – Aziuth

ответ

3

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

public void copy (Customer copyFrom) { 
     this.firstName = copyFrom.firstName; 
     this.lastName = copyFrom.lastName; 
     this.customerID = copyFrom.customerID; 
     this.accounts = copyFrom.accounts; 
     this.numAccounts = copyFrom.numAccounts; 
    } 
1

ваш метод копирования (Customer CopyFrom) не является конструктором. Конструктор возвращает новый объект клиента. То, что делает ваша копия, создает пустой клиент, присваивает значения поля и все. Этот новый клиент ушел из памяти в конце запуска метода. Вы можете решить эту проблему путем копирования() возвращение нового клиента, как:

public Customer copy(Customer copyFrom)... 

Или написать реальный конструктор копирования:

public Customer(Customer copyFrom) 
    { 
     this.firstName = copyFrom.firstName; 
     this.lastName = copyFrom.lastName; 
     this.customerID = copyFrom.customerID; 
     this.accounts = copyFrom.accounts; 
     this.numAccounts = copyFrom.numAccounts; 
    } 
0

В методе копирования (который не является конструктором) вы не должны» t использовать

Customer aCustomer = new Customer(); 

потому что вы не хотите создавать новый экземпляр клиента, вы хотите изменить текущий. Вы должны назначить каждый атрибут текущего экземпляра (this) к значениям экземпляра copyFrom:

public void copy (Customer copyFrom) 
    { 
     this.firstName = copyFrom.firstName; 
     this.lastName = copyFrom.lastName; 
     this.customerID = copyFrom.customerID; 
     this.accounts = copyFrom.accounts; 
     this.numAccounts = copyFrom.numAccounts; 
    } 

, как вы делаете это сейчас, вы могли бы также принять решение о возвращении aCustomer, если вы хотите создать новый копия, но это было бы странно подход, если вы поставите метод копирования внутри класса Customer, было бы лучше, чтобы иметь его в другом классе (я назвал его CustomerHelper) как статический метод:

public static Customer copy (Customer copyFrom) 
{ 
    Customer aCustomer = new Customer(); 
    aCustomer.firstName = copyFrom.firstName; 
    aCustomer.lastName = copyFrom.lastName; 
    aCustomer.customerID = copyFrom.customerID; 
    aCustomer.accounts = copyFrom.accounts; 
    aCustomer.numAccounts = copyFrom.numAccounts; 
    return aCustomer; 
} 

, а затем :

c1 = CustomerHelper.copy(c2); 

Или, если вы хотите создать новый экземпляр, который является копией текущего экземпляра, можно использовать метод, как:

public Customer copy() 
    { 
    Customer aCustomer = new Customer(); 
    aCustomer.firstName = this.firstName; 
    aCustomer.lastName = this.lastName; 
    aCustomer.customerID = this.customerID; 
    aCustomer.accounts = this.accounts; 
    aCustomer.numAccounts = this.numAccounts; 
    return aCustomer; 
    } 

и использовать его:

c1=c2.copy()