Está en la página 1de 22

Construcción de objetos

Dpto. Lenguajes y Sistemas Informáticos


Universidad de Granada

Programación y Diseño Orientado a Objetos

(Curso 2019-2020)
Créditos

Las siguientes imágenes e ilustraciones son libres


y se han obtenido de:
I Emojis, https://pixabay.com/images/id-2074153/

El resto de imágenes e ilustraciones son de creación propia,


al igual que los ejemplos de código

(LSI-UGR) PDOO Constructores 2 / 22


Objetivos

Saber diseñar e implementar constructores

Saber cómo crear varios constructores para una misma clase,


tanto en Java como en Ruby

Saber cómo reutilizar código que sea común a varios


constructores

Conocer cómo se libera la memoria ocupada por los objetos


cuando dejan de ser útiles

(LSI-UGR) PDOO Constructores 3 / 22


Contenidos

1 Constructores
Java
Ruby

2 Mémoria dinámica y pila

(LSI-UGR) PDOO Constructores 4 / 22


Constructores

Cuestiones generales

Antes de usar los objetos es necesario crearlos

La creación implica la reserva de memoria y la inicialización

Normalmente el programador no tiene que ocuparse de la reserva


de memoria en sí misma, pero sí de la inicialización

En algunos lenguajes el programador decide el lugar donde se


alojará cada objeto (pila o heap)

(LSI-UGR) PDOO Constructores 5 / 22


Constructores

Constructores

Los lenguajes orientados a objetos suelen disponer de unos


métodos especiales denominados constructores

A pesar de su nombre, estos métodos solo se encargan de la


inicialización de las instancias

Se deben inicializar TODOS los atributos de instancia

No son métodos de instancia y no especifican ningún tipo de


retorno

Existen diferencias importantes a este respecto en los distintos


lenguajes de programación orientados a objetos

(LSI-UGR) PDOO Constructores 6 / 22


Constructores

Clases-plantilla / Clases-objeto

Clases-plantilla
I En muchos casos tienen el mismo nombre de la clase
I Son invocados automáticamente utilizando la palabra reservada
new

Clases-objeto
I Pueden tener un nombre arbitrario
I Suelen ser métodos de clase

(LSI-UGR) PDOO Constructores 7 / 22


Constructores Java

Java
Tienen el mismo nombre que la clase y no devuelven nada
(tampoco void)

Los constructores se utilizan únicamente para asegurar la


inicialización de los atributos

Al permitir la sobrecarga de métodos, puede haber varios, con


distintos parámetros

Se puede reutilizar un constructor desde otro constructor

Para construir un objeto se antepone la palabra reservada new al


nombre de la clase

Si no se crea ningún constructor existe uno por defecto sin


parámetros
(LSI-UGR) PDOO Constructores 8 / 22
Constructores Java

Ejemplos

Java: Constructor básico


1 class Point3D {
2
3 / / A t r i b u t o s de i n s t a n c i a
4 private int x ;
5 private int y ;
6 private int z ;
7
8 Point3D ( i n t a , i n t b , i n t c ) { / / C o n s t r u c t o r
9 / / Se i n i c i a l i z a n l o s a t r i b u t o s de i n s t a n c i a , TODOS
10 x = a;
11 y = b;
12 z = c;
13 }
14 }

(LSI-UGR) PDOO Constructores 9 / 22


Constructores Java

Ejemplos
Java: Clase con varios constructores y código común
1 class R e s t r i c t e d P o i n t 3 D {
2 p r i v a t e s t a t i c i n t LIMITMAX = 100; / / A t r i b u t o s de c l a s e
3 p r i v a t e s t a t i c i n t LIMITMIN = 0 ;
4 private int x ; / / A t r i b u t o s de i n s t a n c i a
5 private int y ;
6 private int z ;
7
8 p r i v a t e i n t r e s t r i c T o R a n g e ( i n t a ) { / / Mé todo de i n s t a n c i a
9 i n t r e s u l t = Math . max ( LIMITMIN , a ) ;
10 r e s u l t = Math . min ( r e s u l t , LIMITMAX ) ;
11 return r e s u l t ;
12 }
13
14 RestrictedPoint3D ( int x , int y , int z ) { / / Constructor
15 this . x = restricToRange ( x ) ;
16 this . y = restricToRange ( y ) ;
17 this . z = restricToRange ( z ) ;
18 / / Debido a l a i g u a l d a d de nombres ,
19 / / es n e c e s a r i o usar " t h i s " para r e f e r i r s e a l o s a t r i b u t o s
20 }
21
22 RestrictedPoint3D ( int x , int y ) { / / Constructor
23 this ( x , y , 0) ; / / Se l l a m a a l o t r o c o n s t r u c t o r
24 }
25 }

F ¿Qué me decís sobre el método max?


(LSI-UGR) PDOO Constructores 10 / 22
Constructores Java

Ejemplos

Java: Uso de la clase anterior


1 public s t a t i c void main ( S t r i n g [ ] args ) {
2 R e s t r i c t e d P o i n t 3 D p1 = new R e s t r i c t e d P o i n t 3 D (−1, 101 , −2000) ;
3 R e s t r i c t e d P o i n t 3 D p2 = new R e s t r i c t e d P o i n t 3 D ( 1 , 99) ;
4 R e s t r i c t e d P o i n t 3 D p3 = new R e s t r i c t e d P o i n t 3 D ( 5 0 , 51 , 52) ;
5 R e s t r i c t e d P o i n t 3 D p4 = new R e s t r i c t e d P o i n t 3 D (−2000, 50 , 2000) ;
6 }

F ¿Cuál es el estado de cada punto creado?


F ¿Qué métodos son llamados en cada construcción?

(LSI-UGR) PDOO Constructores 11 / 22


Constructores Ruby

Ruby
El equivalente al constructor es un método especial llamado
initialize

Es un método de instancia privado que es llamado


automáticamente por el método de clase new

Se ocupa de la creación e inicialización de atributos de instancia


I Cualquier método de instancia puede crear atributos de instancia
I Lo recomendable es limitar esta labor al método initialize

No se puede sobrecargar initialize (ni ningún otro método)


I Entonces, ¿se pueden tener varios constructores? Opciones:
F Creando métodos de clase que cumplan el cometido de los
constructores (igual que new)
F Haciendo que initialize admita un número variable de parámetros

(LSI-UGR) PDOO Constructores 12 / 22


Constructores Ruby

Ejemplos

Ruby: Ejemplo con un constructor


1 class R e s t r i c t e d P o i n t 3 D
2
3 # A t r i b u t o s de c l a s e
4 @@LIMIT_MAX = 100
5 @@LIMIT_MIN = 0
6
7 private
8 def r e s t r i c _ t o _ r a n g e ( a ) # mé todo de i n s t a n c i a
9 r e s u l t = [ @@LIMIT_MIN , a ] . max
10 r e s u l t = [ @@LIMIT_MAX, r e s u l t ] . min
11 result
12 end
13
14 def i n i t i a l i z e ( x , y , z ) # c r e a c i ón e i n i c i a l i z a c i ón de a t r i b u t o s de i n s t a n c i a
15 @x = r e s t r i c _ t o _ r a n g e ( x )
16 @y = r e s t r i c _ t o _ r a n g e ( y )
17 @z = r e s t r i c _ t o _ r a n g e ( z )
18 end
19 end
20
21 p u t s R e s t r i c t e d P o i n t 3 D . new( −1 ,1 ,1) . i n s p e c t

F ¿Hay algún conflicto de nombres en las líneas 15, 16, ó 17?

(LSI-UGR) PDOO Constructores 13 / 22


Constructores Ruby

Ejemplos

Ruby: Ejemplo con dos constructores


1 class R e s t r i c t e d P o i n t 3 D
2
3 # Añadimos a l có d i g o a n t e r i o r
4
5 def s e l f . new_3D ( x , y , z ) # mé todo de c l a s e
6 new ( x , y , z )
7 end
8
9 def s e l f . new_2D ( x , y ) # mé todo de c l a s e
10 new ( x , y , 0 )
11 end
12
13 p r i v a t e _ c l a s s _ m e t h o d : new # pasa a s e r p r i v a d o
14 end
15
16 p u t s R e s t r i c t e d P o i n t 3 D . new_3D(−1,101,−2000) . i n s p e c t
17 p u t s R e s t r i c t e d P o i n t 3 D . new_2D ( 1 , 9 9 ) . i n s p e c t
18 p u t s R e s t r i c t e d P o i n t 3 D . new_3D ( 5 0 , 5 1 , 5 2 ) . i n s p e c t
19 p u t s R e s t r i c t e d P o i n t 3 D . new_3D( −2000 ,50 ,2000) . i n s p e c t
20 # p u t s R e s t r i c t e d P o i n t 3 D . new( −1 ,1 ,1) . i n s p e c t # E r r o r , new es ahora p r i v a d o

(LSI-UGR) PDOO Constructores 14 / 22


Constructores Ruby

¡Mal ejemplo!

Ruby: Error frecuentemente cometido por los estudiantes


1 class R e s t r i c t e d P o i n t 3 D
2
3 # Forma ERRÓNEA de implementar e s t o s c o n s t r u c t o r e s
4
5 def s e l f . new_3D ( x , y , z ) # mé todo de c l a s e
6 @x = r e s t r i c _ t o _ r a n g e ( x )
7 @y = r e s t r i c _ t o _ r a n g e ( y )
8 @z = r e s t r i c _ t o _ r a n g e ( z )
9 end
10
11 def s e l f . new_2D ( x , y ) # mé todo de c l a s e
12 @x = r e s t r i c _ t o _ r a n g e ( x )
13 @y = r e s t r i c _ t o _ r a n g e ( y )
14 @z = 0
15 end
16
17 p r i v a t e _ c l a s s _ m e t h o d : new # pasa a s e r p r i v a d o
18 end

F ¿Cuáles son los errores? ¿Por qué son errores?


Estos errores, en los exámenes, serán penalizados

(LSI-UGR) PDOO Constructores 15 / 22


Constructores Ruby

Ejemplos

Ruby: initialize con un número variable de parámetros


1 def i n i t i a l i z e ( x , y , ∗z )
2 # ∗z es un a r r a y con e l r e s t o de par ámetros que se pasen
3
4 @x = r e s t r i c _ t o _ r a n g e ( x )
5 @y = r e s t r i c _ t o _ r a n g e ( y )
6 i f ( z . s i z e ! = 0 ) then
7 z_param = z [ 0 ]
8 else
9 z_param = 0
10 end
11 @z = r e s t r i c _ t o _ r a n g e ( z_param )
12 end
13
14 # En a l g ún l u g a r f u e r a de l a c l a s e . . .
15
16 p u t s R e s t r i c t e d P o i n t 3 D . new ( 1 , 2 , 3 , 4 , 5 , 6 ) . i n s p e c t
17
18 # l o s par ámetros e x t r a son i gn o r a d o s

(LSI-UGR) PDOO Constructores 16 / 22


Constructores Ruby

Ejemplos

Ruby: initialize con valores por defecto


1 def i n i t i a l i z e ( x , y , z =0)
2 # e l par ámetro z t i e n e un v a l o r por d e f e c t o
3
4 @x= r e s t r i c _ t o _ r a n g e ( x )
5 @y= r e s t r i c _ t o _ r a n g e ( y )
6 @z= r e s t r i c _ t o _ r a n g e ( z )
7 end
8
9 # En a l g ún l u g a r f u e r a de l a c l a s e . . .
10
11 p u t s R e s t r i c t e d P o i n t 3 D . new ( 1 , 2 ) . i n s p e c t
12 p u t s R e s t r i c t e d P o i n t 3 D . new ( 1 , 2 , 3 ) . i n s p e c t

(LSI-UGR) PDOO Constructores 17 / 22


Constructores Ruby

Ejemplos

Ruby: Parámetros nombrados con valores por defecto


1 # Parámetros nombrados con v a l o r e s por d e f e c t o
2
3 def i n i t i a l i z e ( x : , y : , z :0)
4 @x = r e s t r i c _ t o _ r a n g e (x)
5 @y = r e s t r i c _ t o _ r a n g e (y)
6 @z = r e s t r i c _ t o _ r a n g e (z)
7 end
8
9 # En a l g ún l u g a r f u e r a de l a c l a s e . . .
10
11 p u t s R e s t r i c t e d P o i n t 3 D . new ( x:−1, y : 1 0 1 , z:−2000) . i n s p e c t
12
13 # Puedo cambiar e l orden
14 p u t s R e s t r i c t e d P o i n t 3 D . new ( y : 2 , z : 3 , x : 1 ) . i n s p e c t
15
16 p u t s R e s t r i c t e d P o i n t 3 D . new ( x : 1 , y : 9 9 ) . i n s p e c t

(LSI-UGR) PDOO Constructores 18 / 22


Mémoria dinámica y pila

Memoria dinámica y pila


En Java y Ruby todos los objetos se crean en memoria dinámica
(heap)

En ambos lenguajes las variables contienen referencias a objetos


(punteros)
I Hay algunas excepciones como los tipos primitivos de Java
(int, float, etc.)
I Los String también tienen un tratamiento distinto

Cuando se devuelve el valor de una variable,


se está devolviendo una referencia a un objeto

¿Cómo se libera la memoria?


I Java y Ruby disponen de un recolector de basura que libera
automáticamente la memoria utilizada por objetos no referenciados

(LSI-UGR) PDOO Constructores 19 / 22


Mémoria dinámica y pila

Memoria dinámica y pila: El lenguaje C++


En C++, el programador puede decidir si crea los objetos en la
pila o en el heap
También es el responsable de la liberación de la memoria
reservada en el heap para un objeto

C++: Destructor
1 class A { C++: Pila y Heap
2 };
3 1 void unaFuncion ( ) {
4 class B { 2 A a; / / En l a p i l a
5 private : 3 B ∗b = new B ( ) ; / / En e l heap
6 A ∗atributo ; 4
7 5 // . . .
8 public : 6
9 B() { 7 delete ( b ) ; / / se l i b e r a d e l heap
10 a t r i b u t o = new A ( ) ; 8 / / a l s a l i r se l i b e r a l a p i l a
11 } 9 }
12 10
13 ~B ( ) { 11 i n t main ( ) {
14 / / destructor 12 unaFuncion ( ) ;
15 delete ( a t r i b u t o ) ; 13 }
16 }
17 };

(LSI-UGR) PDOO Constructores 20 / 22


Constructores → Diseño ←

Los constructores no cuestan dinero

El tiempo perdido entendiendo un código enrevesado, sí


Con los constructores, y en general, con cualquier método,
I Sobrecargarlos (si el lenguaje lo permite) de manera
que cada constructor/método haga una cosa muy concreta
I Si el lenguaje no admite sobrecarga, añadir constructores/métodos
con distintos nombres
I Si en un constructor/método, se debe hacer un procesamiento
diferente según el número y tipo de los parámetros recibidos, tal
vez haya que sobrecargarlo (o crear más constructores/métodos)
Los diseños e implementaciones simples son fáciles de mantener

(LSI-UGR) PDOO Constructores 21 / 22


Construcción de objetos

Dpto. Lenguajes y Sistemas Informáticos


Universidad de Granada

Programación y Diseño Orientado a Objetos

(Curso 2019-2020)

También podría gustarte