Область объекта в объекте в Java - PullRequest
0 голосов
/ 14 октября 2010

Я сейчас изучаю Java, поэтому надеюсь, что этот вопрос не слишком очевиден. Я пришел с другого языка, который не имеет сборки мусора. На этом другом языке я иногда создавал объекты в конструкторе, а затем удалял их в деструкторе, чтобы я мог использовать их в течение всей жизни объекта.

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

class user {
    public String username;
    public String displayName;
    user(Connection conn, String usernameIn){
     username = usernameIn;
         ... do DB stuff to populate attributes
    }
}

class booking {
  int bookingID;
  user bookedBy;
  ...
  booking(Connection conn, int bookedIDIn){
     bookingID = bookedIDIn;
      ...do DB stuff to populate attributes and grab bookedByUserID
      ...field value and build the BookedByUsername
     user bookedBy = new user (bookedByUsername)
  }
}

Есть ли способ обойти это? Или мне нужно переосмыслить свой дизайн?

Ответы [ 4 ]

3 голосов
/ 14 октября 2010

Вы создаете новую пользовательскую переменную bookedBy в своем конструкторе, а не используете переменную-член вашего класса.

Возможно, вы захотите изменить:

user bookedBy = new user(bookedByUsername);

с:

bookedBy = new user(bookedByUsername);

2 голосов
/ 14 октября 2010

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

Я думаю, вы хотите это:

class booking {
  int bookingID;
  user bookedBy;
  ...
  booking(Connection conn, int bookedIDIn){
     bookingID = bookedIDIn;
     //there's no declaration of type needed here because 
     //you did that earlier when you declared your member variable up top.
     bookedBy = new user (bookedByUsername) 
  }
}
1 голос
/ 14 октября 2010
 user bookedBy;

и

user bookedBy = new user (bookedByUsername)

- две разные переменные.

Удалите второе объявление типа, и ваш пользовательский экземпляр будет назначен уровню поля.то есть:

class booking {
  int bookingID;
  user bookedBy;
  ...
  booking(Connection conn, int bookedIDIn){
     bookingID = bookedIDIn;
      ...do DB stuff to populate attributes and grab bookedByUserID
      ...field value and build the BookedByUsername
     bookedBy = new user (bookedByUsername)
  }
}
1 голос
/ 14 октября 2010

В вашем классе бронирования вы фактически объявили две переменные, которые называются useredBy. Один имеет область действия для всего класса бронирования, а другой - для конструктора. Чтобы решить эту проблему, вам нужно удалить объявление переменной в вашем конструкторе, как показано ниже:

class booking {
  int bookingID;
  user bookedBy;
  ...
  booking(Connection conn, int bookedIDIn){
     bookingID = bookedIDIn;
      ...do DB stuff to populate attributes and grab bookedByUserID
      ...field value and build the BookedByUsername
    bookedBy = new user (bookedByUsername)
  }
}
...