Les objets en Java

Objectif

Ce laboratoire a pour but de vous faire réviser quelques concepts fondamentaux de Java, y compris les classes et les objets. Le laboratoire va aussi vous permettre de vous (re-)familiariser avec l’environnement de développement logiciel Eclipse.

Remise et date d’échéance

Vous devez remettre par courriel votre rapport de laboratoire et le code source pour la partie 2 avant de début du prochain laboratoire. Votre rapport doit être en en format PDF. Dans Microsoft Word, vous pouvez créer un fichier PDF avec le menu File > Save as....

Le rapport doit inclure vos réponses aux questions ci-dessous avec une discussion sur ce que vous avez appris, les découvertes que vous avez faites, ce qui a été difficile dans le laboratoire, etc. Soyez concis!

Introduction

Un objet est un exemple de données abstraites. En plus d’emmagasiner les données (les attributs), l’objet dispose également d’un ensemble d’opérations (les méthodes) qu’il peut exécuter. Un objet est donc une structure de données avec une partie consacrée aux données et une à l’exécution.

Un programme Java est une collection d’objets qui accomplissent une certaine tâche en échangeant des messages entre eux. Un objet qui transmet un message à un autre objet est implémenté comme un objet qui appelle l’exécution d’une méthode d’un autre objet. Les objets ont donc un ensemble de messages (ou de méthodes) auxquels ils répondent, l’ensemble des messages auxquels un objet répond est l’interface pour cet objet.

Chaque objet a sa propre mémoire composée d’autres objets ou de types primitifs. Chaque objet a un ou plusieurs types. Tous les objets d’un type particulier peuvent recevoir les mêmes messages (car ils partagent tous la même interface).

La classe d’un objet établit un de ces types. Toutes les variables et méthodes sont indiquées dans la définition de classe. Ainsi une classe indique quel genre de donnés et quelles méthodes forment l’interface pour tous les objets d’un certain type. Une fois qu’une classe a été définie, les objets peuvent être instanciés ou créés à partir de la définition de classe. Un objet est une instance d’un type de données abstrait (une classe).

Un objet peut être considéré comme une instance de n’importe laquelle de ses superclasses, ou des interfaces Java qu’il implante, ou des interfaces implantées par ces superclasses.

Pour répondre aux questions posées dans ce laboratoire, vous pouvez vous référer à n'importe quel manuel de référence Java (ou moteur de recherche en ligne). Toutefois, assurez-vous d'indiquer clairement vos sources lorsque vous référez à différents ouvrages dans vos réponses.

Préparation

Avant de commencez, lisez le guide de survie d'Eclipse.

Téléchargez et sauvegardez le fichier: wallball.zip. Ne le dézippez pas.

Lancez le programme Eclipse pour Java et créez un nouveau projet Java nommé, par exemple, GEF320 labo 1. Utilisez le JRE par défaut et choisissez l’option pour avoir des dossiers séparées pour les fichiers source et classe.

Sélectionnez votre projet dans le panneau Package Explorer, faites un clic droit et choisissez Import. Dans la boîte de dialogue, choisissez General > Archive File comme type, trouvez votre copie de wallball.zip et importez-la.

Ouvrez le projet (cliquez sur le petit plus) et le dossier « src ». Vous y trouverez les trois paquets et les huit fichiers sources Java suivants:

wallballgame
    Ball.java
    Paddle.java
    WallBallEquipment.java
wallballgui
    WallballApp.java
    WallballFrame.java
    WallballView.java
wallballsupport
    Collidable.java
    Path.java

Le programme implémente un jeu très simple appelé Wall Ball (un peu comme l’ancien jeu vidéo Pong, mais pour un seul joueur). Pour lancer le jeu, sélectionnez le fichier WallballApp.java et cliquez sur l’icône d’exécution (Run) dans la barre à outils (le triangle blanc dans un cercle vert). Jouez un peu avec le jeu pour voir comment il fonctionne.

Partie 1 — Compréhension du programme

Répondez aux questions suivantes à partir du code fourni. Vous pouvez utiliser l'API Java 8 et le tutorial Java.

Les Classes, les Objets et leur création

1. Donnez un exemple de classe.

2. Donnez un exemple d’objet.

3. Donnez un exemple de constructeur.

4. Dans la classe WallballView, BORDER est une variable d’attribut. Est-ce que BORDER est un objet? Expliquez votre réponse.

5. Dans la classe WallballView, thePaddle est une variable d’attribut. Est-ce que thePaddle est un objet? Expliquez votre réponse.

Création d’objets et initialisation

Jettons maintenant un coup d'oeil à l’initialisation des objets et plus spécifiquement l’initialisation des références aux objets (l’attribution de la mémoire pour les objets courrants et la connexion entre un objet et une variable de référence). Vous pouvez initialiser une référence aux moments suivants:

  • Lorsque l’objet contenant la référence est défini. Cela signifie que les références seront toujours initialisées avant que le constructeur soit appelé.
  • Dans le constructeur de l’objet qui contient la référence.
  • Juste avant que vous deviez réellement utiliser l’objet. Dans certains cas, cela peut réduire le temps d’initialisation ou l’espace mémoire nécessaire si, pendant l’exécution, l’objet n’a pas besoin d’être créé.

6. Donnez un exemple de chacun de ces trois mécanismes d’initialisation trouvé dans les classes données.

7. Quel serait l’effet d’utiliser Integer plutôt que int pour spécifier les types de width et height dans WallBallEquipment? Que-est-ce que c'est la différence entre int et Integer?

Classes et interfaces

Le paquet wallballgame contient trois classes. Deux de ces classes, Ball et Paddle, sont des extensions de (« extends ») la classe WallBallEquipment. La classe WallBallEquipment implémente (« implements ») l’interface Collidable du paquet wallballsupport.

8. Dans vos propres mots, expliquez la différence entre une classe et une interface dans le langage de programmation Java.

9. Quelle est la signification d'une classe qui est une extension d’une autre?

10. Quelle est la signification d'une classe qui implémente une interface?

11. Les constructeurs pour Ball et Paddle contiennent des expressions qui ressemblent à super(fgColor, bgColor, x, y). Quelle est l’effet de cette expression et pourquoi est-elle nécessaire?

12. La classe WallBallEquipment a deux constructeurs. Un des deux contient l’expression this(fgColor, bgColor). Quelle est la signification du mot clé « this » dans Java et comment est-il utilisé dans cette expression?

Invocation des méthodes

13. Expliquez dans vos propres mots comment la méthode suivante de la classe WallBallView détermine si le Paddle a frappé la Ball. Indice: Des objets sont retournés pour chaque appel de méthode dans l'expression if.

private void checkHit(Collidable theBall, Collidable thePaddle) {
      if (thePaddle.getBoundingRectangle()
          .intersects(theBall.getBoundingRectangle())) {
        theBall.getPath().reverseHorizontal();
        } 
    }

Conception de programme

14. Le code dans le projet WallBall contient plusieurs nombres magiques (c-à-d des « constantes numériques non-nommées »). Expliquez dans vos propres mots ce que les nombres magiques sont et pourquoi il faut les éviter dans votre code.

15. Lequel des principes discutés pendant le premier cours recommande l’élimination des nombres magiques?

16. Faites de la recherche au sujet du principe de responsabilité simple et résumez-le brièvement dans vos propres mots.

17. Est-ce que la classe WallBallView est conforme au principe de responsabilité simple? Justifiez votre réponse avec un exemple tiré du code dans la classe WallBallView.

Partie 2 – Modification du programme

Vous avez peut-être remarqué que le menu Paddle Size du jeu ne fait rien. Modifiez le programme pour régler ce problème. Vous pouvez étudier le code qui modifie la couleur de la raquette pour trouver des indices pour la solution. La modification demandera l’addition d’environ une douzaine de lignes de code à trois classes (en fonction de votre solution).

Lorsque vous arriverez à faire changer la grandeur de la raquette correctement. Si la modification de taille se produit près de la frontière de la fenêtre, il est possible que la raquette ne soit plus capable de bouger. Il n’est pas nécessaire de régler ce problème.