Anda di halaman 1dari 71

Asociacin de Clases en Java

V1.0
Febrero 2014
Ferreiras.

Ferreiras Asociaciones de clases en Java 1


Asociacin
Es una simple conexin estructural
o canal entre las clases y es una
relacin donde todos los objetos
(instancias de dichas clases) tienen
su propio ciclo de vida y no hay
dueo.

Ferreiras Asociaciones de clases en Java 2


Asociacin
Es usada para conectar dos clases. Una
lnea slida conecta a las clases asociadas.

Describe una relacin que existir entre


las instancias de las clases en tiempo de
ejecucin. Por ejemplo:

A B

Ferreiras Asociaciones de clases en Java 3


Otro ejemplo:
Cliente Factura

-CliCodigo: string -FacNumero: string


- CliNombre: string - FactFecha: string
-CliApellido:string - CliCodigo: string
-CliBalance:double

Cliente puede saber cuales son sus


facturas, pero factura no puede saber cual
es su cliente.

Ferreiras Asociaciones de clases en Java 4


Asociacin
Existe una asociacin entre dos clases si una
instancia de una clase debe saber sobre la
instancia de la otra clase con el fin de realizar su
trabajo.

Esto es, en una asociacin, una instancia de una


clase usa una instancia de la otra clase para llevar
a cabo una tarea. Por esta razn una asociacin
es llamada una relacin de uso.

Ferreiras Asociaciones de clases en Java 5


Asociacin
Es representada mediante una lnea
slida que conecta a las clases asociadas.

Existir una asociacin entre dos clases


si una instancia de una clase debe saber
sobre la instancia de la otra clase con el
fin de realizar su trabajo para cumplir con
sus responsabilidades.

Ferreiras Asociaciones de clases en Java 6


Por ejemplo:
En el contexto de ... Los estudiantes de informtica de la UASD realizan sus
practicas usando PCs, mediante un permiso ( usuario y contrasea ) que les es
asignado por el encargado los laboratorios de informtica o aulas LIF-XXX... Se
generar una asociacin entre las clases Estudiante y PCLab como
se muestra mas abajo:
Permiso Es el nombre de la
asociacin

Estudiante PCLab
Permiso

Esta representacin puede ser interpretada como:


Estudiante necesita permiso para usar PCLab

PCLab requiere de permiso para Estudiante usarla


Ferreiras Asociaciones de clases en Java 7
Asociacin
 En una asociacin, una instancia de
una clase usa una instancia de la otra
clase para llevar a cabo una tarea, sus
responsabilidades. Por esta razn una
asociacin es llamada una relacin de
uso.

Ferreiras Asociaciones de clases en Java 8


Asociacin
 Si en la declaracin del problema
encontramos trminos como usar a,
enviar a, obtener de, depender
de, solicitar a, pedir a, requerir
de, o informar a o comunicar a
estos son indicios, pistas que
probablemente indiquen asociaciones de
clases.

Ferreiras Asociaciones de clases en Java 9


Asociacin
La cantidad de clases participantes
podrn ser dos o mas;
Asociaciones binarias Son
asociaciones que relacionan dos clases.
Las mas comunes son las
asociaciones binarias, porque son las
mas fcil de conceptualizar .

Ferreiras Asociaciones de clases en Java 10


Asociacin
 Las clases que colaboran usualmente
se relacionan a travs de asociaciones. Es
por ello que las tarjetas CRC (Clase-
Responsabilidad-Colaboracin), a ver mas
adelante en este curso, son una fuente,
tambin, para identificar asociaciones de
clases.

Ferreiras Asociaciones de clases en Java 11


Elementos en un asociacin
Aclaran la relacin representada por la
asociacin.

Son:

Nombre de la asociacin (opcional);


Roles de las clases (opcional);
Multiplicidad;

Veamos su explicacin y uso.


Ferreiras Asociaciones de clases en Java 12
Elementos en un asociacin
 Nombre1 de la asociacin, con un smbolo,
opcional, que indique el sentido en el cual se
debe leer. Por ejemplo:

Persona Empleo 
Empresa

Es el nombre de la Este smbolo es opcional,


apuntando a la direccin en
asociacin. la cual fluye la relacin.

1: Si no esta nombrada, por


Ferreiras
defecto el nombre es tiene.
Asociaciones de clases en Java 13
Elementos en un asociacin
 Continuando con el ejemplo anterior:
Persona Empresa
Empleo 

Claramente, esta asociacin representa el hecho


de que Persona es empleada por Empresa

Y, nunca podr entenderse como Empresa es


empleada por Persona, porque as lo establece el
smbolo  para su lectura.

Ferreiras Asociaciones de clases en Java 14


Elementos en un asociacin
 El nombre de una asociacin es
elegido de modo que, en combinacin con
los nombres de las clases relacionadas, se
pueda producir una sentencia sensata que
describa la relacin entre dichas clases
conectadas. Como, por ejemplo:

Persona es empleada por Empresa

Ferreiras Asociaciones de clases en Java 15


Elementos en un asociacin

Algunos gures Sugieren usar una


frase verbal para que el nombre de la
asociacin refleje el propsito de la relacin.
Otros gures Sugieren usar un simple
nombre. En este curso usaremos,
preferiblemente, este estilo,
democrticamente establecido por el
profesor.

Ferreiras Asociaciones de clases en Java 16


Elementos en un asociacin

 Rol o papel que desempea un


extremo Cada extremo de la asociacin
pueden ser etiquetado con un nombre del
rol o papel que desempea en sta, el cual
aclara la naturaleza de dicha asociacin.

Ferreiras Asociaciones de clases en Java 17


Elementos en un asociacin

 Un nombre de un rol Se elige para


describir cmo se ven los objetos de una
clase en un extremo de una asociacin
desde la perspectiva de los objetos de la
clase del otro extremo.

Ferreiras Asociaciones de clases en Java 18


Elementos en un asociacin
Por ejemplo, en la asociacin Empleo:
rol

empleado empleador
Persona Empresa

Rol: Cada objeto Persona


Rol: Cada objeto Empresa
ve a un objeto Empresa
ve a un objeto Persona
como su empleador.
como su empleado.
Luego, empleador seria
Luego, empleado seria
un nombre apropiado para
un nombre apropiado para
el rol de cada objeto de la
el rol de cada objeto de la
clase Empresa
clase Persona

Ferreiras Asociaciones de clases en Java 19


 Otro ejemplo

Cliente roles Factura

-CliCodigo: string -FacNumero: string


- CliNombre: string genera pertenece - FactFecha: string
-CliApellido:string - CliCodigo: string
-CliBalance:double

 La lectura de las asociaciones


mostradas es como sigue:
CLIENTE genera FACTURA

FACTURA pertenece a CLIENTE

Ferreiras Asociaciones de clases en Java 20


 Otro ejemplo:
Vendedor roles Producto
- VendorCodigo: long - ProCodigo: long
- VendorNombre: string suple suplido - ProDescripcion: string
- VendorApellido:string - ProPrecio: double
- VendorTel: string

Vendedor suple Producto

Producto es suplido por Vendedor

Ferreiras Asociaciones de clases en Java 21


 Mas ejemplos de nombres de roles

Note: One Personal Computer sees the System Unit (the CPU) as your computer brain.

Recuperated from
http://www.ts.mah.se/RUP/RationalUnifiedProcess/process/modguide/md_assoc.htm
Ferreiras Asociaciones de clases en Java 22
Roles, algunos tips de inters
La mayor parte de la informacin acerca
de una asociacin se define en sus
extremos ( los roles de sus respectivas
clases ).
Su uso es opcional, algunos gures
no lo usan para evitar sobrecargar mucho
la representacin de la asociacin.

Ferreiras Asociaciones de clases en Java 23


Roles, algunos tips de inters
Por Ejemplo:
CursoDeMaestria CursoDeGrado

Requerimiento

Un CursoDeMaestria requiere un CursoDeGrado

Ferreiras Asociaciones de clases en Java 24


Roles, algunos tips de inters
En la implementacin de la asociacin,
El nombre del rol Tendr un papel
importante;
En la implementacin de la asociacin,
Es de estilo que el nombre del rol sea el de
una variable puntero (C++), o referencia (
Java ) del tipo de la clase en el extremo
donde sta est.
Ferreiras Asociaciones de clases en Java 25
Cardinality in Associations
An association has two ends
Each end can connect to one or many objects, depending on how
the association is defined in the database schema
Objectivity/DB associations support four categories of cardinality:
1:1 one-to-one
1:m one-to-many
m:1 many-to-one
n:m many-to-many

Ferreiras Asociaciones de clases en Java 26


Multiplicidad
La multiplicidad de una asociacin define el
nmero de instancias de una clase en un
extremo de dicha asociacin que esta
conectado con una instancia de la clase en
el otro extremo. Luego, esta multiplicidad
puede ser:
 Uno-A-Uno
 Uno-A-Mucho
 Mucho-A-Uno
 Mucho-A-Mucho
Ferreiras Asociaciones de clases en Java 27
Multiplicidad
Para expresar de manera ms clara la
multiplicidad de una asociacin se pueden usar,
solos o combinados, el cero, nmeros naturales
y el smbolo de la cerradura de Kleene ( ).
En esta representacin, la multiplicidad
proporciona la misma informacin que las
construcciones de conectividad y cardinalidad,
en la relacin de participacin en el modelo ER
( a ver en INF-526 con Ferreiras )

Ferreiras Asociaciones de clases en Java 28


 Las expresiones ms comunes son:

Multiplicidad Significado
0..1 Cero Uno
1 Uno slo, exactamente uno, uno
0.. Cero ms, mucho
1.. Uno ms, al menos uno
n nicamente n ( Donde n > 1 )
0..n Cero a n ( Donde n > 1 )
1..n Uno a n ( Donde n > 1 )
n..m n a m ( Donde n & m > 1 )
n..m z Un numero exacto; p.e.: 3..4 6
Compleja Por ejemplo: 0..1, 3..4, 6.. significa cualquier
nmero de objetos que no sean 2 5.

Ferreiras Asociaciones de clases en Java 29


Multiplicidad
Por ejemplo, en la asociacin Empleo:
empleado empleador
Persona Empresa
1

Es la multiplicad de este 1 Es la multiplicidad de este


extremo e indica que Cero o extremo e indica que Un
mas objetos Persona objeto Empresa empleador,
empleado estn conectados, exactamente uno, esta
por medio de la asociacin conectado con un objeto
Empleo, con un objeto Persona empleado
Empresa empleador

Ferreiras Asociaciones de clases en Java 30


 Ejemplo:
Cliente roles Factura

-CliCodigo: string -FacNumero: string


- CliNombre: string genera pertenece - FactFecha: string
-CliApellido:string - CliCodigo: string
-CliBalance:double 1 0..

multiplicidad

 La lectura de las asociaciones mostradas es


como sigue:

un CLIENTE genera cero o mas FACTURA

una FACTURA pertenece a un (solo uno) CLIENTE

Ferreiras Asociaciones de clases en Java 31


 Ejemplo:
Vendedor roles Producto

- VendorCodigo: long -ProCodigo: long


- VendorNombre: string suple suplido - ProDescripcion: string
- VendorApellido:string - ProPrecio: double
- VendorTel: string 1 0..

multiplicidad

un Vendedor suple cero o ms Producto

un Producto es suplido por un Vendedor

Ferreiras Asociaciones de clases en Java 32


Representacin de asociaciones mucho-A-mucho

Estudiante Asignatura
inscrito seleccin


inscripcin

Un Estudiante se inscribe en muchas Asignaturas

Una Asignatura es inscripta por muchos Estudiantes

Ferreiras Asociaciones de clases en Java 33


Representacin de asociaciones mucho-A-mucho
Factura Producto
listado vendido


... 1..

Una Factura lista muchos (al menos 1) Productos

Un Producto es vendido en cero o mas Facturas

Ferreiras Asociaciones de clases en Java 34


Multiplicidad
 Cmo leer las anotaciones de
multiplicidad ? Para dar una descripcin
ms completa de la relacin que est siendo
representada por la asociacin, las anotaciones
de multiplicidad se pueden leer:
 En conjunto con los nombres de los roles
de los extremos; O,
 Con los nombres de las clases asociadas,
solamente.
Ferreiras Asociaciones de clases en Java 35
Multiplicidad
Por ejemplo, la asociacin Empleo
empleado empleador
Persona Empresa
1

Puede ser leda como :


Una Persona empleado trabaja para una Empresa empleador; O,

Una Persona trabaja para una Empresa

Ferreiras Asociaciones de clases en Java 36


Multiplicidad
 El significado preciso de las anotaciones
de multiplicidad tiene que ver con el nmero
de conexiones que pueden existir en un
momento dado, en tiempo de ejecucin.

 Por ejemplo, considerando la asociacin


Empleado que hemos estado usando,
podemos decir que:

Ferreiras Asociaciones de clases en Java 37


Empleo
SIN : Empresa
Alicia : Persona Empleo

CNN : Empresa
Balbuena : Persona

 Son ilegales porque:


a) El objeto Persona Alicia trabaja simultneamente para
dos objetos Empresas;
b) El objeto Persona Balbuena no esta conectado a
ningn objeto Empresa.

Ferreiras Asociaciones de clases en Java 38


Multiplicidad
En general, la informacin de multiplicidad
debe ser mostrada en las asociaciones, pero
los nombres de la asociacin y los
nombres de los roles de los extremos son
opcionales. Se debe elegir un nivel de
detalle necesario para hacer una
representacin de fcil comprensin.

Ferreiras Asociaciones de clases en Java 39


Multiplicidad
 Si hay mas de una asociacin entre el
mismo par de clases, es necesario algn
etiquetado textual para clarificar las
asociaciones y asegurar que la multiplicidad
correcta es entendida para cada asociacin.
Por ejemplo:

Ferreiras Asociaciones de clases en Java 40


 Por ejemplo: Considerando el caso de
que una persona pueda ser empleado y a
la vez cliente de una empresa.
empleado empleador

Persona
1 Empresa
cliente proveedor

Una Persona es empleado de una Empresa
Una Empresa es empleador de cero o mas Persona
Una Persona es cliente de cero o mas Empresa
Una Empresa es proveedor de cero o mas Persona

Ferreiras Asociaciones de clases en Java 41


Multiplicidad
 En una asociacin reflexiva o unaria,
Esto es, una asociacin en la cual ambos
extremos conectan a la misma clase, los
nombres de los roles de los extremos son
muy tiles para distinguirlos entre si y
esclarecer lo representado por la asociacin.
Por ejemplo:

Ferreiras Asociaciones de clases en Java 42


hijo
Persona

DescenderDe 
1..

Procrear 
padre 2

Un hijo debe descender de dos padre

Un padre debe procrear uno o mas hijo

Ferreiras Asociaciones de clases en Java 43


 Otro ejemplo:

supervisor
Empleado
1

obrero
2..10

Un supervisor debe supervisar 2 a 10 obreros


OJO: De obrero a supervisor no hay inters
Ferreiras Asociaciones de clases en Java 44
Navegabilidad
Muestra la direccin en la cual una
asociacin puede ser recorrida o consultada,
mediante una punta de flecha en la lnea de la
asociacin. Por ejemplo:
0..* 1..*
Cliente Direccin

Un cliente puede ser consultado acerca de su


direccin; pero una direccin no puede ser
consultad por su cliente.

Ferreiras Asociaciones de clases en Java 45


 En otras palabras, En la asociacin
Cliente Direccin anterior, Un objeto
Cliente debe conocer sus objetos
Direccin con los que est asociados,
pero un objeto Direccin no tiene
conocimiento de los objetos Cliente con
los que est asociados.

Ferreiras Asociaciones de clases en Java 46


 Otro ejemplo de navegabilidad
Persona Carro

Una Persona es propietaria de 0 ms Carro;


En la representacin actual, no hay forma de
consultar desde Carro a Persona

Ferreiras Asociaciones de clases en Java 47


 Otro ejemplo de navegabilidad

Pedido Mercanca

cantidad 0..* 1..* peso


aplicaITBIS precio
calcularSubtoal getPrecio
calcularPesoTotal getPeso

 Un objeto Pedido puede ser consultado


acerca de sus objetos Mercancia, pero no a la
inversa, esto es, un objeto Mercanca no puede
ser consultado acerca de sus objetos Pedido.

Ferreiras Asociaciones de clases en Java 48


 La navegabilidad se utiliza para
registrar el hecho de que ciertos
conexiones de clases en el sistema slo se
podran recorrer, o los mensajes enviados,
en una direccin. La navegabilidad es
indicada por medio de una flecha abierta,
que se coloca en el extremo de la lnea de
asociacin junto a la clase de destino.

Ferreiras Asociaciones de clases en Java 49


Asociacin unidireccional,
asociacin bidireccional
 Asociacin unidireccional Es aquella
asociacin cuya navegabilidad es en un solo
sentido. Esto significa que la clase de origen
tiene una referencia a la clase destino, pero la
clase destino no sabe acerca de la clase de
origen. Esto ltimo es importante a tener en
cuenta para fines de implementacin. Los
ejemplos anteriores son asociaciones
unidireccionales.

Ferreiras Asociaciones de clases en Java 50


Asociacin unidireccional,
asociacin bidireccional
 Asociacin bidireccional Es aquella
asociacin cuya navegabilidad es en ambos
sentidos. Esto significa que ambas clases tienen
referencias entre s. En otras palabras, ambas
clases en los extremos de la asociacin son, al
mismo tiempo, origen y destino. Ambas se
pueden consultar entre s. Por defecto, si no se
indica la navegabilidad, la asociacin es
bidireccional.

Ferreiras Asociaciones de clases en Java 51


propietario
 Por ejemplo:

1..1 0..*
Persona Perro
propietario mascota

Representa los mismo que:


1..1 0..*
Persona Perro
propietario mascota
 Un objeto Persona puede consultar cuantos objetos Perro tiene.
 Un objeto Perro puede consultar cul es su nico objeto Persona.
 En la implementacin, la clase Persona y la clase Perro tendrn
referencias entre s ( un contenedor de mascota en Persona y una variable
propietario en Perro ).
 Normalmente se implementan dividindolas en dos asociaciones
unidireccionales y una tercera clase que las conecta.

Ferreiras Asociaciones de clases en Java 52


Implementacin de asociaciones
[ Codificando asociaciones ]
Implementar una asociacin es codificar
en un lenguaje de programacin la situacin
representada.
Normalmente, esto es hecho usando
variables punteros ( C++ ) o referencias
(Java), inicializndolas en el constructor.

Ferreiras Asociaciones de clases en Java 53


/*
Asociacion2.java
jdk1.7.0_13

Ferreiras / Java/ Association / 1-M

Implementar la asociacion indicada:

+---------+ miEscuela miProfesor +--------+


| Escuela |--------------------------------->|Profesor|
+---------+ 1..1 1..* +--------+

*/

Ferreiras Asociaciones de clases en Java 54


import java.util.Vector;

class Escuela {

private String nombre;


private Vector<Profesor> profesores;

public Escuela( Vector<Profesor> vp, String no ) {


profesores = vp;
nombre = no;
}

public String getNombre() { return nombre; }

public void mostrarProfes( ) {


for( int i = 0; i < profesores.size(); ++i ) {
System.out.println( profesores.get(i).getNombre() );
}
}
}

Ferreiras Asociaciones de clases en Java 55


class Profesor {

private String nombre;

public Profesor( String no ){

nombre = no;
}

public String getNombre() { return nombre; }

Ferreiras Asociaciones de clases en Java 56


public class Asociacion2 {

public static void main( String [] fofi ) {

Profesor p1 = new Profesor( "Ramon Turey");


Profesor p2 = new Profesor( "Eugenio Santos");
Profesor p3 = new Profesor( "Maria Tutu");

Vector<Profesor> vp = new Vector<Profesor>();


vp.add(p1);
vp.add(p2);
vp.add(p3);

Escuela e1 = new Escuela( vp, "Geografia" );

System.out.println("\n* Los profesores de " + e1.getNombre() + " son:");


e1.mostrarProfes();

Ferreiras Asociaciones de clases en Java 57


*

C:\Archivos de programa\Java\jdk1.7.0_13\bin>javac Asociacion2.java

C:\Archivos de programa\Java\jdk1.7.0_13\bin>java Asociacion2

* Los profesores de Geografia son:

Ramon Turey
Eugenio Santos
Maria Tutu

C:\Archivos de programa\Java\jdk1.7.0_13\bin>

*/

Ferreiras Asociaciones de clases en Java 58


/*
Asociacion3.java
jdk1.7.0_13

Ferreiras / Java / Asociacion de clases / M-M

En la UASD un Estudiante cursa asignaturas varios Departamentos y


un Departamento tiene inscritos varios Estudiantes.

* *
Estudiante ---------------- Departamento

Para implementar esta asociacion:

* 1 1 *
Estudiante --------------- Curso --------------- Departamento

Ver cdigo completo en el grupo.


*/

Ferreiras Asociaciones de clases en Java 59


C:\Archivos de programa\Java\jdk1.7.0_13\bin>javac Asociacion3.java
C:\Archivos de programa\Java\jdk1.7.0_13\bin>java Asociacion3

* El Estudiante Antonio Lopez

* Tiene clases en el curso AB-101

* Las asignaturas son

Fisica
Matematica
Informatica

* Del departamento Fisica

* Tienen clases en el curso AB-101

* Los estudiantes

Antonio Lopez
Puerta Rota
Pedro La Cosa

C:\Archivos de programa\Java\jdk1.7.0_13\bin>

Ferreiras Asociaciones de clases en Java 60


 Un ejemplo de implementacin de inters
es el de la siguiente asociacin reflexiva:

Curso

Prerrequisito

Un Curso es prerrequisito de muchos Curso


Muchos Curso son prerrequisito de un Curso

Ferreiras Asociaciones de clases en Java 61


 Implementada como asociacin
unidireccional, representar esta situacin:
El objeto Curso9:Curso conoce
que los objetos curso2:Curso,
curso3:Curso y curso4:Curso
curso7:Curso son sus prerrequisitos curso2:Curso

curso6:Curso curso9:Curso curso3:Curso

El objeto Curso9:Curso no
conoce que los objetos
curso5:Curso curso7:Curso, curso6:Curso y curso4:Curso
curso5:Curso lo consideran
como uno de sus prerrequisitos,
que dependen de el

Ferreiras Asociaciones de clases en Java 62


La implementacin unidireccional, en Java, de la clase
Curso tendra, entre otras cosas, lo siguiente:

class Curso {
private String codigoCurso;
private String nombreCurso;
private double costoPorCredito;
private Vector<Curso > prerrequisitos;
//.... Para almacenar los
objeto Curso que
}
son su prerrequisito.

Ferreiras Asociaciones de clases en Java 63


Si la implementacin bidireccional:

Para almacenar los


class Curso { objetos Curso que
son su prerrequisito.
private String codigoCurso;
private String nombreCurso;
private double costoPorCredito;
private Vector<Curso> prerrequisitos;
private Vector<Curso> prerrequisitoDe;
//....
} Para almacenar los
objeto Curso que lo
consideran su
prerrequisito.

Ferreiras Asociaciones de clases en Java 64


 Asignacin para ser entregada cuando
sea requerida formalmente en el grupo:

Ahora es su turno Joven: Considere la situacin de la vida real


universitaria que usted conoce, esto es, varios profesores imparten
clase en una misma aula, obviamente que a diferentes horarios cada
uno, es decir, no se juntan dos profesores en una misma aula en un
mismo horario, y un profesor puede impartir clase en varias aulas
pero, si imparte clase, debe ser en un aula, sin que tenga choque
de aulas. Un profesor querr saber las aulas que tiene asignadas y
un aula querr saber los profesor que tiene asignados.

Su trabajo: Hacer la representacin y la


implementacin en cdigo Java
Ferreiras Asociaciones de clases en Java 65
 A partir de la siguiente informacin acerca
del juego de crquet:

 Un equipo de crquet tiene 11 jugadores. Uno de ellos es


el capitn;

 Un jugador slo puede jugar para un equipo;

 El capitn lidera a los miembros del equipo;

Construir la asociacin correspondiente.

Ferreiras Asociaciones de clases en Java 66


 Solucin del problema anterior

1 0..1
jugadores capitn
Jugador Equipo
10
11 miembro-de  1
1 capitn

liderea

 Su tarea1: Implementar esta asociacin


1: Para su entrega, esperar el requerimiento formar en el grupo.
Esto significa, que usted debe hacerla ya y guardarla a la espera
de que sea requerida por el profesor.
Ferreiras Asociaciones de clases en Java 67
EJEMPLOS

INF512_C++_Tema_???_Ejem.zip

Ferreiras Asociaciones de clases en Java 68


EJERCICIOS

INF512_C++_Tema_???_Ejem.doc

Ferreiras Asociaciones de clases en Java 69


 Pendiente para una prxima versin:
Clase de asociacin (Association Class).

Ferreiras Asociaciones de clases en Java 70


Ferreiras Asociaciones de clases en Java 71