2010-10-14 4 views
0

J'apprends Java en ce moment, j'espère que cette question n'est pas trop évidente. Je viens d'une autre langue qui n'a pas de garbage collection. Dans cette autre langue, j'ai parfois créé des objets dans le constructeur, puis les ai supprimés dans le destructeur afin que je puisse les utiliser pendant toute la vie de l'objet.Portée de l'objet au sein d'un objet en Java

À titre d'exemple simplifié, j'ai un utilisateur et une classe de réservation. La classe de réservation référence un utilisateur mais si je crée l'utilisateur dans le constructeur de la classe de réservation, il déréférence l'utilisateur une fois qu'il quitte le constructeur et devient hors de portée. Tout appel de référence future à l'utilisateur booking.bookedBy renvoie alors la valeur 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) 
    } 
} 

Y a-t-il un moyen de contourner ce problème? Ou dois-je repenser mon design?

+0

ne pas utiliser de noms de classes minuscules, s'il vous plaît. – Thilo

+0

Point pris - Je vais essayer de se conformer. Existe-t-il une convention de dénomination standard documentée nulle part? Une autre raison pour laquelle je préfère les langages insensibles à la casse. – Peter

+0

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

Répondre

3

Vous créez une nouvelle variable utilisateur bookedBy dans votre constructeur, plutôt que d'utiliser votre classe variable membre.

Vous voulez probablement changer:

user bookedBy = new user(bookedByUsername);

avec:

bookedBy = new user(bookedByUsername);

+0

Excellent qui fonctionne. Montre mon inexpérience en utilisant Java. Je suppose que je suis l'utilisation de Delphi où vous déclarez toutes les variables locales en haut de la méthode. Merci pour le pointeur. – Peter

2

Vous déclarez une variable locale dans votre constructeur et elle est utilisée pour affecter l'utilisateur que vous créez dans le constructeur.

Je pense que vous voulez ceci:

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

Ou, si vos goûts s'exécutent de cette façon, le Python-infuenced 'this.bookedBy = ...', ce qui évite l'ambiguïté. – bobince

+0

Bonne idée. Je pourrais utiliser "ceci" surtout quand je commence à utiliser la langue. – Peter

1

Dans votre classe de réservation, vous avez effectivement déclaré deux variables appelées utilisateur bookedBy. L'un a une portée pour l'ensemble de la classe de réservation et l'autre a une portée pour le constructeur. Pour résoudre ce problème, vous devez supprimer la déclaration de variable dans votre constructeur comme indiqué ci-dessous:

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; 

et

user bookedBy = new user (bookedByUsername) 

sont deux variables différentes. Supprimez la déclaration du second type et votre instance d'utilisateur sera allouée au niveau du champ. par exemple:

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