2010-10-14 4 views
0

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

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

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) 
    } 
} 

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

+0

не используйте имена в нижнем регистре, пожалуйста. – Thilo

+0

Точка взята - я постараюсь соответствовать. Существует ли какое-либо стандартное соглашение об именах? Еще одна причина, по которой я предпочитаю нечувствительные к регистру языки. – Peter

+0

http://www.oracle.com/technetwork/java/codeconv-138413.html –

ответ

3

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

Вы, вероятно, хотите изменить:

user bookedBy = new user(bookedByUsername);

с:

bookedBy = new user(bookedByUsername);

+0

Отлично работает. Показывает мою неопытность с использованием Java. Я предполагаю, что я использую Delphi, где вы объявляете все локальные переменные в верхней части метода. Спасибо за указатель. – Peter

2

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

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

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) 
    } 
} 
+0

Или, если ваши вкусы работают таким образом, Python-infuenced 'this.bookedBy = ...', который избегает двусмысленности. – bobince

+0

Хорошая идея. Я мог бы использовать «это», особенно когда я буду использовать язык. – Peter

1

В классе бронирования, вы на самом деле объявили две переменные с именем пользователя bookedBy. У одного есть возможность для всего класса бронирования, и у него есть возможность для конструктора. Чтобы устранить эту проблему, необходимо удалить объявление переменной в конструкторе как показано ниже:

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
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) 
    } 
} 
Смежные вопросы