NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
Se han eliminado las denominaciones de los paquetes (package), porque depende del package
que cada uno cree al implementar las clases.
Si se comprueba a través de la consola, pegando cada clase en un archivo de notas diferente,
recuerda:
- Todos los archivos deben estar en la misma carpeta pues pertenecen al mismo
paquete.
- Todos los archivos deben llamarse exactamente como el nombre de su [Link]. Es
decir, para el primero el archivo se llamaría [Link]. Hay que respetar las
mayúsculas y minúsculas (cuidado con el archivo [Link], la primera letra es
mayúscula).
- Se compila solamente el archivo ejecutable [Link] con el comando “Javac
[Link]” (sin comillas).
- Se ejecuta el programa llamando al archivo compilado con el comando “Java Principal”
(sin comillas y, como ves, sin extensión).
Si se comprueba a través de Eclipse, pegando cada clase en una clase dentro de un paquete
creado, recuerda:
- Debes crear un paquete dentro de un nuevo proyecto (nómbralo como quieras).
- Las clases que crees deben llamarse exactamente igual que las he nombrado yo,
respetando mayúsculas y minúsculas.
- Asegúrate de que todas las clases se encuentran dentro del mismo package y que al
crearlas aparece el package en la primera línea de cada una de ellas.
Copia y pega el código en el bloc de notas o en Eclipse tal cual se presenta. Si modificas algún
carácter puedes desestabilizarlo.
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link]
import [Link];
public class Principal {
public static void main(String[] args) {
// Creación de los arrays.
ArrayList<Pelicula> peliculas = new ArrayList<Pelicula>();
ArrayList<Serie> series = new ArrayList<Serie>();
// Datos para cada posición del array. 5 películas y 5 series.
[Link](new Pelicula("El Padrino", "Crime, Drama", "Francis
Ford Coppola", 1972, 175));
[Link](new Pelicula("Pulp Fiction", "Crime, Drama",
"Quentin Tarantino", 1994, 164));
[Link](new Pelicula("Origen", "Sci-Fi", "Christopher
Nolan", 2010, 148));
[Link](new Pelicula("El viaje de Chihiro", "Animation",
"Hayao Miyazaki", 2002, 125));
[Link](new Pelicula("El indomable Will Hunting", "Drama",
"Gus Van Sant", 1998, 126));
[Link](new Serie("Breaking Bad", 5, "Thriller", "Vince
Gilligan", 49));
[Link](new Serie("Sherlock", 4, "Mystery", "Mark Gatiss,
Steven Moffat", 88));
[Link](new Serie("Los Soprano", 6, "Crime, Drama", "David
Chase", 55));
[Link](new Serie("Arrested Development", 5, "Comedy",
"Mitchell Hurwitz", 22));
[Link](new Serie("Friends", 10, "Comedy", "David Crane, Marta
Kauffman", 22));
// Comando try, catch, finally para probar parte del código.
// Declaramos una variable global para recoger el valor del
error.
boolean error1 = false;
try{
/* Código generado para seleccionar la posición de dos
películas y dos series distintas de forma
* aleatoria.
* [Link] genera un número aleatorio dentro del tamaño
del Arraylist. Los valores que toma
* se encuentran entre 0 y el valor dado. En este caso,
como las posiciones del Arraylist comienzan
* en 0, el mayor valor que puede tomar es el tamaño -1.
* Con el comando while le decimos que elija un número
aleatorio para el segundo siempre que sea
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
* igual al primero. De esta forma nos aseguramos de que
las dos películas y las dos series elegidas
* sean distintas. */
int paleatorio_a = (int)([Link]()*[Link]()-1);
int paleatorio_b = (int)([Link]()*[Link]()-1);
int saleatorio_a = (int)([Link]()*[Link]()-1);
int saleatorio_b = (int)([Link]()*[Link]()-1);
while (paleatorio_a == paleatorio_b) {
paleatorio_b = (int)([Link]()*[Link]()-
0);
}
while (saleatorio_a == saleatorio_b){
saleatorio_a = (int) ([Link]()*[Link]()-
1);
}
/* Marcamos como Visto las posiciones generadas
aleatoriamente con el método marcarVisto de la clase
correspondiente. En cada ejecución del programa serán
diferentes.*/
[Link](paleatorio_a).marcarVisto();
[Link](paleatorio_b).marcarVisto();
[Link](saleatorio_a).marcarVisto();
[Link](saleatorio_b).marcarVisto();
// Si parte del código anterior genera una excepción de tamaño en
el Array la variable se marca como true
}catch(IndexOutOfBoundsException arraEx){
error1 = true;
/* Si el error se ha producido (marcado como true) el programa
muestra un mensaje de acuerdo al
* comportamiento esperado. Si no se ha producido muestra que todo
es correcto y nos indica como
* producir el error para comprobarlo. En este caso podemos
comprobar fácilmente el comportamiento
* colocando un +50 en lugar de cualquier -1 de las lineas 48 a
51. */
}finally {
if (error1 == true) {
[Link]("* Nota de comprobación del
comando try.");
[Link]("* La posición elegida para
marcar las visualizadas está fuera del\n* tamaño del Array.");
[Link]("* Las peliculas y series vistas
que contengan el error no serán\n* marcadas y no se mostrarán como tal.");
} else {
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link]("* Nota de comprobación del
comando try.");
[Link]("* De momento el programa
funciona correctamente");
[Link]("* Para comprobar el
comportamiento cambia un '-1' de las lineas\n* 48 a 51 en la clase Principal
por el valor '+50'. El código\n* generará una excepción y otro resultado será
mostrado.");;
}
}
/* Impresión de todas las películas y series llamando al método
mostrarDatos(), que a su vez llama
* al método toString() pero conteniendo el dato extra que lleva
cada clase.
* Los sysout imprimen títulos.*/
[Link]("\n\n - TODAS LAS PELICULAS -\n");
for (Pelicula pelicula : peliculas) {
[Link]();
}
[Link]("\n - TODAS LAS SERIES -\n");
for (Serie serie : series) {
[Link]();
}
/* Impresión de películas y series marcadas como vistas.
* El primer sysout imprime un titulo.
* Con el blucle for recorremos el array, comparando cada
resultado con el método getVisto.
* En caso de que sea distinto de false se muestra el resultado
en lista, con el título y los
* minutos vistos. Los minutos están calculados en el método
tiempoVisto de la clase correspondiente,
* con un operador aleatorio. Más información ampliada alli.
* Se muestra también la duración total en minutos del elemento,
para que pueda compararse el resultado.
* El comando \t devuelve una tabulación. El comando \n devuelve
un salto de linea. */
[Link]("\n - DETALLE DE PELICULAS VISTAS -\n");
for (Pelicula pelicula : peliculas) {
boolean pvisto = [Link]();
if (pvisto!=false){
[Link](" Titulo:
"+[Link]());
[Link](" Duración:
"+[Link]()+" minutos");
[Link](" Minutos vistos:
"+[Link]()+"\n");
}
}
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link]("\n - DETALLE DE SERIES VISTAS -\n");
for (Serie serie : series) {
boolean svisto = [Link]();
if (svisto!=false){
[Link](" Titulo: "+[Link]());
[Link](" Duración: "+[Link]()
+" minutos");
[Link](" Minutos vistos:
"+[Link]()+"\n");
}
/* Impresión de la serie con mas temporadas.
* El primer sysout es un titulo.
* Recorremos con un bucle for el array correspondiente,
guardando en las variables cada vez
* el valor mayor para el número de temporadas y la posición en
la que se encuentra.*/
[Link]("\n - SERIE CON MAS TEMPORADAS -\n");
int mayor = 0;
int sposicion = 0;
for (int a = 0; a<[Link](); a++) {
int actual = [Link](a).getTemporadas();
if (actual>mayor){
mayor=actual;
sposicion = a;
}
}
/* Se imprimen los datos con el método mostrarDatos para la
posición elegida, el método toString está
* implementando en la clase padre CommonData e incluido en el
método mostrarDatos de cada subclase, para
* poder añadirle los datos extra (las temporadas en este caso).
*/
[Link](sposicion).mostrarDatos();
/* Impresión de la película de año más reciente.
* El primer sysout es un titulo.
* Recorremos con un for el array correspondiente, guardando en
las variables cada vez el valor
* mayor para el año y la posición en la que se encuentra. */
[Link]("\n - PELICULA DE AÑO MÁS RECIENTE -\n");
int reciente = 0;
int pposicion = 0;
for (int a = 0; a<[Link](); a++) {
int actual = [Link](a).getYear();
if (actual>reciente){
reciente=actual;
pposicion = a;
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
}
}
/* Se imprimen los datos con el método mostrarDatos para la
posición elegida, el método toString está
* implementando en la clase padre CommonData e incluido en el
método mostrarDatos de cada subclase, para
* poder añadirle los datos extra (el año en este caso). */
[Link](pposicion).mostrarDatos();
}
}
[Link]
public class Pelicula extends CommonData implements IVisualizable {
// Atributos que no figuran en la clase padre Commondata
private int year;
// Metodo constructor default
public Pelicula(){
/* Metodo constructor para titulo y creador, no se incluye el valor
visto en false porque ya es su valor
* por default. */
public Pelicula (String titulo, String creador){
[Link](titulo);
[Link](creador);
// Metodo constructor para todos los atributos excepto visto
public Pelicula (String titulo, String genero, String creador, int year,
int duracion) {
[Link](titulo);
[Link](genero);
[Link](creador);
[Link](duracion);
[Link] = year;
}
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
// Getters y setters para las variables de esta clase (no incluidas en
Commondata)
public int getYear() {
return year;
}
public void setYear(int year) {
[Link] = year;
}
// Método marcarVisto declarado en la interface. Marca el atributo Visto
de la clase padre como true.
@Override
public void marcarVisto() {
[Link](true);
// Método esVisto declarado en la interface. Devuelve el valor de Visto
en la clase padre.
@Override
public void esVisto() {
[Link]();
/* Método tiempoVisto declarado en la interface. Para que no quedasen a
cero ni fueran iguales,
* se ha utilizado la variable [Link] de la clase Object, que
genera un número aleatorio entre
* los argumentados. Los valores de la duración están dados en minutos,
en este caso se genera un numero
* aleatorio hasta el total de segundos de la pelicula o serie elegida,
para poder disgregar después el
* resultado en minutos y segundos.
* Devuelve una cadena con el resultado de la operación.*/
@Override
public String tiempoVisto() {
int tiempovisto = (int)
([Link]()*([Link]()*60)+1);
String operacion = tiempovisto/60+" minutos "+tiempovisto
%60+" segundos";
return operacion;
/* Mostramos los datos llamando al método toString de la clase padre
Commondata. Se ha implementado éste
* método mostrarDatos a mayores para poder incluir para esta clase el
atributo year(año).
* El comando \n devuelve un salto de linea */
public void mostrarDatos(){
[Link]([Link]());
[Link](" Año: "+year+"\n");
}
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link]
public class Serie extends CommonData implements IVisualizable{
// Atributos que no figuran en la clase padre Commondata
private int temporadas = 1;
// Método constructor default
public Serie(){
/* Metodo constructor para titulo y creador, no se incluye el valor
visto en false porque ya es su valor
* por default. */
public Serie (String titulo, String creador){
[Link](titulo);
[Link](creador);
// Metodo constructor para todos los atributos excepto visto
public Serie (String titulo, int temporadas, String genero, String
creador, int duracion){
[Link](titulo);
[Link] = temporadas;
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link](genero);
[Link](creador);
[Link](duracion);
// Getters y setters para las variables de esta clase (no incluidas en
Commondata)
public int getTemporadas() {
return temporadas;
}
public void setTemporadas(int temporadas) {
[Link] = temporadas;
}
// Método marcarVisto declarado en la interface. Marca el atributo Visto
de la clase padre como true.
@Override
public void marcarVisto() {
[Link](true);
// Método esVisto declarado en la interface. Devuelve el valor de Visto
en la clase padre.
@Override
public void esVisto() {
[Link]();
/* Método tiempoVisto declarado en la interface. Para que no quedasen a
cero ni fueran iguales,
* se ha utilizado la variable [Link] de la clase Object, que
genera un número aleatorio entre
* los argumentados. Los valores de la duración están dados en minutos,
en este caso se genera un numero
* aleatorio hasta el total de segundos de la pelicula o serie elegida,
para poder disgregar después el
* resultado en minutos y segundos.
* Devuelve una cadena con el resultado de la operación.*/
@Override
public String tiempoVisto() {
int tiempovisto = (int)
([Link]()*([Link]()*60)+1);
String operacion = tiempovisto/60+" minutos "+tiempovisto%60+"
segundos";
return operacion;
/* Mostramos los datos llamando al método toString de la clase padre
Commondata. Se ha implementado éste
* método mostrarDatos a mayores para poder incluir para esta clase el
atributo temporadas. */
public void mostrarDatos(){
[Link]([Link]());
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link](" Temporadas: "+temporadas+"\n");
[Link]
public class CommonData {
// Atributos comunes de las clases Pelicula y Serie.
private String titulo;
private String genero;
private String creador;
private int duracion;
private boolean visto;
/* Getters y setters de los atributos declarados. Se incluyen los del
atributo visto para poder trabajar
* después con ellos en los métodos declarados en la interface. */
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
[Link] = titulo;
}
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4
[Link] = genero;
}
public String getCreador() {
return creador;
}
public void setCreador(String creador) {
[Link] = creador;
}
public int getDuracion() {
return duracion;
}
public void setDuracion(int duracion) {
[Link] = duracion;
}
public boolean getVisto() {
return visto;
}
public void setVisto(boolean visto) {
[Link] = visto;
}
/* Método toString de la clase Object. Devuelve una cadena de texto
combinada con los atributos generados .
* El símbolo \n provoca un salto de linea*/
public String toString(){
String datos = " Titulo: "+titulo+"\n"+" Género: "+genero+"\n"+"
Creador: "+creador+"\n"+" Duración: "+duracion+" minutos"+"\n"+" Visto:
"+visto;
return datos;
}
[Link]
public interface IVisualizable {
// Declaración de los métodos de la interface.
public void marcarVisto();
public void esVisto();
public String tiempoVisto();
DIAGRAMA DE CLASES
NETFLIX 2 PROGRAMANDO EN JAVA SEMANA 4