2013-11-12 5 views
4

Я пытаюсь создать копию моего объекта Board, но, похоже, это не экземпляр. Может кто-нибудь сказать мне, почему?экземпляр объекта, не создающий экземпляр

class Board { 
     private Board _copyBoard; 
     private int _size; 
     public Board (int N) { 
      _size = N; 
     } 
     public Board (Board b) { 
      this._copyBoard = b; 
     } 
     int size() { 
      return _size; 
     } 
    } 

Когда я делаю:

Board b = new Board(4); 
    Board x = new Board(b); 
    System.out.println(x.size()); --> 0 instead of 4. 
+3

Этот код не компилируется. Отправьте фактический код – Reimeus

+0

Второй конструктор, который принимает экземпляр типа 'Board', никогда не устанавливает значение' _size' (кстати, у него нет типа). – David

+1

Я не вижу, как это могло бы генерировать 'NullPointerException', оно должно просто напечатать' 0' ... – MadProgrammer

ответ

0
Board b = new Board(4); 

Это создаст новую доску, где его поле _size = 4.

Board x = new Board(b); 

Это создаст новую доску, где его поле _copyBoard = b.

System.out.println(x.size()); 

Это выведет на поле _size второй доске. Нигде вы не связаны с переменной _size первой платы.

Вы можете решить эту проблему, делая

public Board (Board b) { 
    this._copyBoard = b; 
    } 

    int size() { 
    if(_copyBoard != null) { 
     return _copyBoard.size(); 
    } else { 
     return _size; 
    } 
    } 

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

class Board { 
    private int _size; 
    public Board (int N) { 
     _size = N; 
    } 
    public Board (Board b) { 
     _size = b.size(); 
    } 
    int size() { 
     return _size; 
    } 
} 
+1

Эта новая версия 'size()' будет терпеть неудачу в объектах, построенных с помощью первого конструктора. – David

+0

@David: это будет, но, насколько показано код и намерение, только текущее решение находится в пределах заданных границ. Я не знаю его точных требований, чтобы дать более точное решение, но оно будет работать для его показанного теста. –

+0

@SotiriosDelimanolis: это не так, я предполагаю, что OP что-то придумал. –

1

Copy конструктор должен нормально скопировать переменные экземпляра и при необходимости некоторые глубинное государство - не сохранить ссылку на исходный объект.

Ваши методы получения & должны иметь возможность управлять собственным состоянием объекта, в его собственных переменных. Имея какую-то структуру двойного пути во всем мире, с if утверждениями, которые будут , либо ваши собственные переменные или оригинальный экземпляр, из которого он был скопирован, плохой дизайн и очень сложный/неэффективный.

public class Board { 
    protected int  size; 
    protected Cell[][] grid; 
    public Board (int N) { 
     this.size = N; 
     // for example, create a 2D array. 
     this.grid = new Cell[size][size]; 
    } 
    public Board (Board orig) { 
     this.size = orig.size(); 
     // deep-copy the grid. 
     this.grid = new Cell[size][]; 
     for (int i = 0; i < size; i++) { 
      grid[i] = Arrays.copyOf(orig.grid[i], size); 
     } 
    } 
    public int size() {return size;} 
} 

я сильно предпочитаю protected над частным, для большей универсальности & технического доступа.

Я также не использую префиксы полей, но вместо этого устраняю назначения полей (в сеттерах или других методах) с this.. Этот подход очень хорошо подходит для простых полей.

Для коллекций я суффикс имен полей со списком или картой или что-то еще; параметры называются без суффикса. Это делает множественные операции & метод-вызовы с множественными значениями четкими. Например, add (List<Customer> customers) добавит их в поле customerList.

+0

Добавить пример и выиграть плюшевый;) – MadProgrammer

+0

Сделав это, не изменил бы ли я свой первоначальный объект Board, если скажу, что сбросил размер моего объекта Board Board? – user1923

+0

Нет, нужно скопировать внутренние данные, чтобы у нас есть _separate instance & fields_ с логическими значениями _same_, но независимо модифицируемыми. Если бы они не были независимыми, это не было бы большой копией, и в этом случае не было бы никакого смысла в том, чтобы быть отдельным экземпляром вообще. –

0

попробовать

Board b = new Board(4); 
Board x = new Board(b); 
System.out.println(x._size); 

class Board { 
    public Board _copyBoard; 
    public int _size; 
    public Board (int N) { 
     this._size = N; 
    } 
    public Board (Board b) { 
     this._size = b._size; 
    } 
    int size() { 
     return _size; 
    } 
} 

В вы код вы не копируете значение размера х, вместо размера становится копируется в переменную экземпляра внутри X

Если вы переменную общественность, в вашем затем строка ниже будет печатать скопированное значение в вашем коде

System.out.println(x._copyBoard._size); 
Смежные вопросы