Resumen Capitulo 10

Este capítulo está en el diseño de clase y explora las diferencias entre la programación de procedimientos y la programación orientada a objetos.

10.2 Clase de abstracción y encapsulación

Los detalles de la implementación están encapsulados y ocultos para el usuario. Esto se conoce como encapsulación de clase. Un ejemplo de la vida real es:

Para que los componentes (disco duro,memoria,CPU) funcionen juntos, solo necesita saber cómo se usa cada componente y cómo interactúan con los demás. No necesita saber cómo funcionan internamente los componentes. La implementación interna está encapsulada y oculta para usted. Puede construir una computadora sin saber cómo se implementa un componente.

Desde la perspectiva del desarrollador de una clase, una clase está diseñada para ser utilizada por muchos clientes diferentes. Para ser útil en una amplia gama de aplicaciones.

10.3 Pensar en objetos

El paradigma procesal se centra en el diseño de métodos. El paradigma orientado a objetos combina datos y métodos juntos en objetos. El diseño de software utilizando el paradigma orientado a objetos se enfoca en objetos y operaciones en objetos. El uso de objetos mejora la reutilización del software y hace que los programas sean más fáciles de desarrollar y de mantener.

10.4 Relaciones de clase

Para diseñar clases, debe explorar las relaciones entre clases. Las relaciones comunes entre clases son asociación, agregación, composición y herencia. Esta sección explora asociación, agregación y composición.

10.4.1 Asociación

La asociación es una relación binaria general que describe una actividad entre dos clases. Por ejemplo, un estudiante que toma un curso es una asociación entre la clase Estudiante y la clase Curso, y un miembro de la facultad que imparte un curso es una asociación entre la clase Facultad y la clase Curso.

Una asociación se ilustra mediante una línea continua entre dos clases con una etiqueta opcional que describe la relación.

Cada clase involucrada en la relación puede tener un nombre de rol que describe el rol que desempeña en la relación. El carácter * significa un número ilimitado de objetos, y el intervalo m..n indica que el número de objetos está entre m y n.

10.4.2 Agregación y composición

La agregación es una forma especial de asociación que representa una relación de propiedad entre dos objetos. Un objeto puede ser propiedad de varios otros objetos agregados.

Si un objeto es propiedad exclusiva de un objeto de agregación, la relación entre el objeto y su objeto de agregación se denomina composición.

Por ejemplo, «un estudiante tiene un nombre» es una relación de composición entre la clase Estudiante y la clase Nombre, mientras que «un estudiante tiene una dirección» es una relación de agregación entre la clase Estudiante y la clase Dirección, ya que una dirección puede compartirse por varios estudiantes.

En UML, un diamante relleno se adjunta a una clase de agregación (en este caso, Estudiante) para denotar la relación de composición con una clase agregada (Nombre), y un diamante vacío se adjunta a una clase de agregación (Estudiante) para denotar la relación de agregación con una clase agregada (Dirección).

Puede existir agregación entre objetos de la misma clase. Por ejemplo, una persona puede tener un supervisor. Utiliza una matriz para almacenar a los estudiantes en el curso. Para simplificar, inscripción máxima en el curso es igual a 100. La matriz se crea utilizando la nueva Cadena [100] en la línea 3. El método addStudent (línea 10) agrega un alumno a la matriz. Cada vez que se agrega un nuevo estudiante al curso, se incrementa el número de estudiantes (línea 12). El método getStudents devuelve la matriz. El método dropStudent (línea 27) se deja como ejercicio.

10.6 Estudio de caso: diseño de una clase para pilas

¿Cómo implementas la clase StackOfIntegers? Los elementos en la pila se almacenan en una matriz llamada elementos. Cuando crea una pila, también se crea la matriz. El constructor sin argumentos crea una matriz con la capacidad predeterminada de 16. El tamaño variable cuenta el número de elementos en la pila, y el tamaño – 1 es el índice del elemento en la parte superior de la pila, como se muestra en la Figura 10.13. Para una pila vacía, el tamaño es 0.

10.7 Procesamiento de valores de tipo de datos primitivos como objetos

Los valores de tipo de datos primitivos no son objetos en Java. Al usar una clase contenedora, puede procesar valores de tipo de datos primitivos como objetos. Estos métodos «convierten» objetos en valores de tipo primitivos:

Recuerde que la clase String contiene el método compareTo para comparar dos cadenas. Las clases de contenedor numérico contienen el método compareTo para comparar dos números y devuelve 1, 0 o -1, si este número es mayor, igual o menor que el otro número. Por ejemplo,

new Double(12.4).compareTo(new Double(12.3)) returns 1;

new Double(12.3).compareTo(new Double(12.3)) returns 0;

new Double(12.3).compareTo(new Double(12.51)) returns -1;

10.8 Conversión automática entre tipos primitivos y tipos de clase de contenedor.

Un valor de tipo primitivo se puede convertir automáticamente en un objeto utilizando una clase de contenedor, y viceversa, según el contexto. La conversión de un valor primitivo en un objeto contenedor se llama boxeo. La conversión inversa se llama unboxing.

10.9 Las clases BigInteger y BigDecimal

Las clases BigInteger y BigDecimal se pueden usar para representar enteros o números decimales de cualquier tamaño y precisión. Si necesita calcular con números enteros muy grandes o valores de punto flotante de alta precisión, puede usar las clases BigInteger y BigDecimal en el paquete java.math.

10.10 La clase de cadena

Un objeto String es inmutable: su contenido no se puede cambiar una vez que se crea la cadena. La clase String tiene 13 constructores y más de 40 métodos para manipular cadenas.

Puede invocar el método charAt (index) para obtener un carácter en el índice especificado de una cadena, el método length () para devolver el tamaño de una cadena, el método de subcadena para devolver una subcadena en una cadena y el indexOf y lastIndexOf métodos para devolver el primer o el último índice de un personaje coincidente o una subcadena.

10.10.1 Construir una cadena

Puede crear un objeto de cadena a partir de un literal de cadena o de una matriz de caracteres. Para crear una cadena a partir de un literal de cadena, use la sintaxis:

Cadena newString = nueva Cadena (stringLiteral);

El argumento stringLiteral es una secuencia de caracteres encerrados entre comillas dobles. La siguiente instrucción crea un mensaje de objeto de cadena para el literal de cadena «Bienvenido a Java «:

10.10.2 Cuerdas inmutables y cadenas internados

La JVM usa una instancia única para literales de cadena con la misma secuencia de caracteres para mejorar la eficiencia y ahorrar memoria. Tal instancia se llama una cadena interna.

10.10.3 Reemplazo y división de cadenas

La clase String proporciona los métodos para reemplazar y dividir cadenas.

Una vez que se crea una cadena, su contenido no se puede cambiar. Los métodos replace, replaceFirst y replaceAll devuelven una nueva cadena derivada de la cadena original (¡sin cambiar la cadena original!).

El método de división se puede utilizar para extraer tokens de una cadena con los delimitadores especificados.

Por ejemplo, el siguiente código

String[] tokens = «Java#HTML#Perl».split(«#»);

for (int i = 0; i < tokens.length; i++)

 System.out.print(tokens[i] + » «);

10.10.4 Emparejamiento, reemplazo y división por patrones

Una expresión regular (expresión abreviada) es una cadena que describe un patrón para hacer coincidir un conjunto de cadenas.

10.10.5 Conversión entre cadenas y matrices

Las cadenas no son matrices, pero una cadena se puede convertir en una matriz y viceversa. Para convertir una cadena en una matriz de caracteres, use el método toCharArray. Por ejemplo, la siguiente declaración convierte la cadena Java en una matriz

char[] chars = «Java».toCharArray();

Para convertir una matriz de caracteres en una cadena, use el constructor String (char []) o el método valueOf (char []). Por ejemplo,

String str = new String(new char[]{‘J’, ‘a’, ‘v’, ‘a’});

10.10.6 Convertir caracteres y valores numéricos en cadenas

Se puede usar Double.parseDouble (str) o Integer.parseInt (str) para convertir una cadena en un valor doble o un valor int y puede convertir un carácter o un número en una cadena utilizando el operador de concatenación de cadenas. Otra forma de convertir un número en una cadena es usar el método valueOf estático sobrecargado. Este método también se puede usar para convertir un carácter o una matriz de caracteres en una cadena.

10.10.7 Cadenas de formato

La clase String contiene el método de formato estático para devolver una cadena formateada. Este método es similar al método printf

La sintaxis para invocar este método es:

String.format(format, item1, item2, …, itemk)

10.11 Las clases StringBuilder y StringBuffer

Las clases StringBuilder y StringBuffer son similares a la clase String.

La clase StringBuilder es similar a StringBuffer, excepto que los métodos para modificar el búfer en StringBuffer están sincronizados, lo que significa que solo una tarea puede ejecutar los métodos. Utilice StringBuffer si varias tareas pueden acceder simultáneamente a la clase

La clase StringBuilder tiene tres constructores y más de 30 métodos para administrar el generador y modificar cadenas en el generador. Puede crear un generador de cadenas vacío o un generador de cadenas a partir de una cadena utilizando los constructores.

10.11.1 Modificación de cadenas en el StringBuilder

Puede agregar nuevos contenidos al final de un generador de cadenas, insertar nuevos contenidos en una posición especificada en un generador de cadenas y eliminar o reemplazar caracteres en un generador de cadenas, utilizando los métodos enumerados en la Figura 10.19.

Todos estos métodos de modificación, excepto setCharAt, hacen dos cosas:

■ Cambiar el contenido del generador de cadenas

■ Devuelve la referencia del generador de cadenas

10.11.2 toString, capacidad, longitud, setLength, y métodos de charAt

La clase StringBuilder proporciona los métodos adicionales para manipular un generador de cadenas y obtener sus propiedades.

El método capacity () devuelve la capacidad actual del generador de cadenas. La capacidad es el número de caracteres que el generador de cadenas puede almacenar sin tener que aumentar su tamaño.

El método length () devuelve el número de caracteres realmente almacenados en la cadena constructor.

El método setLength (newLength) establece la longitud del generador de cadenas.

El método charAt (index) devuelve el carácter en un índice específico en el generador de cadenas.

Ejemplo de Comprobando Palíndromos

Considerar todos los caracteres en una cadena para verificar si es un palíndromo.

Referencia:

Liang, Y. (2013). Introduction to Java programming (10th ed., pp. 365-392). Boston: Pearson.

Deja un comentario

Diseña un sitio como este con WordPress.com
Comenzar