Objectius de l’Activitat.

Els elecments de la llista seran objectes classe que implementi el programa.

En aquesta acivitat volem implementar un sistema de col·leccions que no es quedi sols amb un nombre concret de bolles, volem que ens permeti crear tants d’objectes BouncingBall com ens plantejem.Gràcies al polimorfisme que ofereix la POO els objectes podran ser extensions de BouncingBall, podran tenir altres comportaments, així també emprarem la classe BouncingNew o altres i provarem de ficarles dins la col·lecció per veure el comportament resultant.

Una col·lecció és un sistema organitzatiu que ens permet guardar elements d’una manera ordenada i accessible. Durant el curs ja hem empleat coleccions, els arrays.

Una col·lecció és una agrupació d’elements (objectes) en la qual s’hi han de poder executar diverses accions: afegir, recórrer, cercar, extreure… Tradicionalment, les estructures pensades per a l’organització de la informació s’han classificat segons el tipus d’accés que proporcionen. El llenguatge Java, conscient de la importància d’aquesta organització, proporciona un conjunt complet d’estructures que abraça les diverses possibilitats d’organització de la informació, i constitueix el conegut framework de col·leccions (Java collections framework o JCF).
El framework de col·leccions de Java, que neix en la versió 1.2 de Java, i en la versió 1.5 incorpora els tipus genèrics, està format per tres tipologies de components:

• Interfícies.Tipus abstractes de dades (TAD) que defineixen la funcionalitat de les col·leccions i funcionalitats de suport.

• Implementacions. Classes que implementen les interfícies de les col·leccions, de manera que una interfície pot tenir més d’una implemen- tació (classe que la implementi).

• Algorismes. Mètodes que efectuen càlculs (cerques, ordenacions…) en els objectes de les implementacions.

En aquesta unitat emprarem La col·lecció ArrayList i implenta instruccions que ens permeten:

  • l.add(new …): afegir un objecte nou.
  • l.remove(i): llevar un objecte de la posició “i” de la llista l.
  • l.clear(): borrar tota la llista l
  • l.get(x): agafa l’objecte que està situat a la posició x de la llista l.

Els esdeveniments de control (moviment, càlculs de distàncies, control de finalització,…) estaran implementats dins un bucle que recorrerà desde 0 a .size() de la llista.

int i=0;
while(bolles.size()){ 
bolles.get(i).move(); 
if(bolles.get(i).getXPosition();=550){ //Control de final ()
            bolles.remove(i);         // lleva la bolla si ha arribat a 550 de X.
        }
      i++;
   }


Implementacions de l’Activitat.

Implementació 1. Afegir el col·leccionador

Al projecte actual i hem d’afegir un col·leccionador d’objectes, ho farem amb una llista del tipus ArrayList, una llista que s’importa desde les biblioteques de Java. Ho farem a la classe BallDemo que és la que té el mètode principal. Per importar aquesta biblioteca s’ha  d’afegir la instrucció “import java.util.ArrayList;” .

Per tal de poder tenir un col·leccionador de BouncingBalls l’hem de declarar de forma que sigui vist de manera global per tots els mètodes. Ho declaram com   “public static ArrayList <BouncingBall> bolles;“.

Quadarà una capçalera com la que segueix:

package balldemo;

import java.awt.Color;
import java.util.ArrayList;


public class BallDemo 
{
    private Canvas myCanvas;
    public static ArrayList  bolles;.
    ...
    ...

Amb aquestes linies de codi la Classe BallDemo està preparada per tenir:

  • Un Canvas que és on dibuixarem.
  • Una ArrayList que són els objectes que dibuixam.

Exercici 13.1:

  • Afegeix a la capçalera de la classe BallDemo els imports i els estats indicats.

Implementació 2. Crear la llista:

Ara falta que quan entrem al programa creem el nou ArrayList de bolles, es fa afegint la línia “bolles = new ArrayList<>();”

Ho podem fer dins del constructor de BallDemo():

public BallDemo()
    {
        //myCanvas = new Canvas("Ball Demo", 600, 500);
        myCanvas = Canvas.getCanvas();
        bolles = new ArrayList();
    }

Exercici 13.2:

  • Afegeix a la classe BallDemo dins el seu constructor la creació de la llista.

Implementació 3. Insertar nou element a la llista.

Ara cada vegada que entrem una bolla nova ho farem amb : “bolles.add(new BouncingNew(20, 50, 16, Color.BLUE, ground, myCanvas));” Aquesta instrucció ens permet ficar al programa una bolla de tipus BouncingBall, que també són las que té d’herència, per ara tenim BouncingNew i també la podem col·leccionar dins la llista.

// create and show the balls
        bolles.add(new BouncingBall(70, 50, 16, Color.YELLOW, ground, myCanvas));
        bolles.add(new BouncingNew(170, 80, 20, Color.RED, ground, myCanvas));

Exercici 13.3:

  • Borra les construccions de les variables de bolla sobre variables que contenia el codi abans.
  • Dins del mètode bounce de BallDemo has d’afegir l’addició de 4 bolles amb colors i llocs diferents.
  • Ara no et funcionarà el projecte per què has de fer l’accés com t’indica la següent implementació.

Implementació 4. Obtenir i manipular objectes de la llista.

Un objecte dins una llista ocupa una posició. La instrucció “bolles.get(i).move();” dona accès a l’objecte que ocupa la “i” posició dins la llista de bolles, sobre aquest objecte BouncinBall hi aplicarà el mètode move(). Si a la posició “i” no hi ha cap objete es produirà un error.

La llista també pot contenir objectes extesos de la Classe BouncingBall.

Exercici 13.4:

  • De dins el bucle d’execució borra les crides de les variables de bolla als mètodes move();
  • i substitueixes per crides al mètode per els indexos 0, 1, 2 i 3, amb la forma de
    bolles.get(0).move();bolles.get(1).move();...".
  • Pots llevar el final d’execució i així no tendràs problemes de variables.

Exercici 13.5:

  • Mijançant un bucle fes que es crein 50 bolles. A una posició diferent cadascuna d’elles.
  • Pots emprar un Random per generar nombres. Per tenir un random hem de fer una variable random de la forma que segueix:
    • per crear el random: Random a= new Random();
    • per agafar un random: r.nextInt(256); //256 significa que es un random entre 0 i 256.
  • Pots llevar el final d’execució i així no tendràs problemes de variables.

Exercici 13.6:

  • Mijançant un bucle fes que es crein 50 bolles, 25 de una classe i 25 de l’altre. A una posició diferent cadascuna d’elles.
  • Pots emprar un Random per generar nombres. Per tenir un random hem de fer una variable random de la forma que segueix:
    • per crear el random: Random a= new Random();
    • per agafar un random: r.nextInt(256); //256 significa que es un random entre 0 i 256.
  • Pots llevar el final d’execució i així no tendràs problemes de variables.

Implementació 5. Control de la llista d’objectes.

Si tot està ben implementat, podem suposar que tenim un ArrayList que conté objectes, sabem que en podem afegir, sabem que en poden borrar, sabem que els podem consultar i també podem invocar els seus mètodes. Ens faltaria implementar un control dels esdeveniments que volem que succeixin, és a dir: quan volem aturar l’execució, quan volem que un element surti de la llista, si volem una condició de distància entre objectes, si volem una condició de temps, …

  • Per afegir es farà com hem vist a la implementació anterior. O sigui que ja ho sabem.
  • Per borrar s’ha d’invocar el mètode .remove() HEM D’ANAR ALERTA AMB EL QUE FEIM, automàticament borrarà l’objecte i recolarà els altres de darrera de la seva posició a una posició anterior, aquesta acció comporta que:
    • no passa res perque ja sabem i que passarà i ho tenim controlat
    • accedim a un objecte equivocat
    • ens sortim de la llista per un mal càlcul de la sortida.
    • altres coses que ja veureu.
  • Per consultar emprarem la instrucció .get(index) com si fos una array normal. Vos faig saber que hi ha implementacions molt més ràpides i recomanables per usar com son els sistemes de cursors i streams, que simplifiquen molt la creació i control de bucles.
  • Per invocar un mètode ho farem “bolles.get(posicio).move();” . Així de simple, si una bolla se’n va cap a la dreta per que li diu move hi anirà, si ha d’anar a l’esquerra així ho farà. CADA OBJECTE SEGUIRÀ LA SEVA IMPLEMENTACIÓ DE MOVIMENT.
  • Pot ser per millorar una implementació s’ha d’afegir mètodes i estats. Ho farem sobre la classe mare i així ho podrem invocar desde totes les classes. Un exemple que pot passar és que una bolla desaparegui i no es torni a pintar, pot ser hauria de tenir un estat de actiu en lloc de borrarlo de la llista directament com s’ha fet a l’exemple. Tot dependrà de l’objectiu del projecte.
Tots els controls d’execució, les col·leccions i les Classes han d’estar raonats abans de ser implementats, és d’on surten les millors implementacions de projectes.

Exercici 13.6:

  • Fes una implementació de control que aturi totes les bolles quan alguna arribi a la posició 550.

Exercici 13.7:

  • Fes una implementació de control que aturi les bolles que arribin a la posició 550.

Exercici 13.8:

  • Fes una implementació de control que aturi les bolles parells que arribin a la posició 550.

Exercici 13.9: La Bolla Monstre

  • En aquest exercici hem de crear un nou tipus de bolla que faci un moviment dreta a esquerra. Li podem possar de nom BollaMonstre, que serà un extends de BouncingBall.
  • La bolla monstre la podem posar dins una variable solta fent un new i després la podem comparar amb tota la llista de bolles.
  • Amb el mètode de distància podem implementar que: si una bolla pega a la bolla monstre desaparegui (per exemple).
  • Com ho fariem per tal que canvias de direcció?
admin2on batxilleratObjectius de l'Activitat. En aquesta acivitat volem implementar un sistema de col·leccions que no es quedi sols amb un nombre concret de bolles, volem que ens permeti crear tants d'objectes BouncingBall com ens plantejem.Gràcies al polimorfisme que ofereix la POO els objectes podran ser extensions de BouncingBall, podran tenir altres...Blog Aula Informàtica Gimnèsia