[ Foro de Java ]

Acceso desde otras clases a atributos privados mediante métodos públicos.

09-May-2014 12:20
Angel Bravo
4 Respuestas

Éste es un código que funciona sin problema y que permite a otras subclases acceder a los atributos (matriz, num_filas, num_columnas) y usarlos a conveniencia.


import java.util.Scanner;

class Matriz {
   byte num_filas, num_columnas;
   int[][] matriz;
   Scanner datosMatriz;
    
    
    //-----------Constructor--------------//
   Matriz() {
   }

	//-----------Métodos------------------//
   void leerMatriz() {
      datosMatriz = new Scanner(System.in); 
      System.out.print("Número de filas: ");	   
      num_filas = datosMatriz.nextByte();
      System.out.print("Número de columnas: ");
      num_columnas = datosMatriz.nextByte();
      matriz = new int[num_filas][num_columnas];	
      for (byte f = 0; f < num_filas; f++) {
         for (byte c = 0; c < num_columnas; c++) {
            System.out.print("Introducir valor " + (f + 1) + "." + (c + 1) + " ");
            matriz[f][c] = datosMatriz.nextInt();
         }
      }
   }
}


La cuestión es que se supone que los atributos deben ser privados y los métodos públicos, y que las subclases accedan a los datos por medio de estos métodos. Y he ahí el problema, no sé cómo hacerlo...¿se supone que se debe hacer por medio de "setters" y "getters"? ¿algo así?


int [][] getMatriz() {
   return matriz;
   }


Ando un poco perdido de cómo debería asignarlo en esta clase para recibirlo y usarlo en las subclases con métodos como éste por ejemplo.


   int traza () {
      int traza = 0;
      for (byte i = 0; i < num_columnas; i++) {
         traza = traza + matriz[i][i];
      }
      System.out.println("La traza es " + traza);
      return traza;
   }



11-May-2014 17:51
Nacho Cabanes (+84)

Efectivamente, se recomienda que los atributos sean privados, para que puedas cambiar los detalles privados de implementación sin afectar a la parte que manejan los usuarios de tu clase.

En ese caso, una solución como


int [][] getMatriz() {
   return matriz;
   }


No es especialmente práctica, porque dejas ver detalles internos. Al menos te permite "jugar" un poco, porque, por ejemplo, podrías usar una lista dinámica para crear una "matriz dispersa" (de gran tamaño, con la mayoría de posiciones "vacías") y aun así devolver al usuario un array bidimensional, sin que sepa que internamente que tú has optimizado.

Es más habitual crear métodos "getNumColumnas", "getNumFilas" y "getElemento(fila, columna)".

Así, desde otra clase usarías algo como


   int traza () {
      int traza = 0;
      for (byte i = 0; i < num_columnas; i++) {
         traza = traza + miMatriz.getElemento(i,i);
      }
      System.out.println("La traza es " + traza);
      return traza;
   }



11-May-2014 18:45
Angel Bravo

Gracias por la contestación, de todas formas creo que voy a tomarme unas "vacaciones de java". Conocía C y sobretodo Pascal, donde llegué a hacer programas de estadística de miles de líneas de código sin mucha dificultad, pero aprender la POO en general y java en particular me esta resultando agotadoramente frustrante. A ver si dejando que el código se enfríe se vuelve más legible ¿¬¬


12-May-2014 20:03
Nacho Cabanes (+84)

Te comprendo. La POO sólo tiene sentido para programas muy grandes, especialmente cuando hay que repartir trabajo entre varias personas. Para programas sencillos, marea más de lo que ayuda... ;-)


12-May-2014 20:28
Angel Bravo

Creo (siempre desde mi desconocimiento) que más que para programas sencillos (el kernel de linux está hecho en C) son para programas específicos, como por ejemplo, los que realizaba sobre estadística. Simplemente había que incluir cada nuevo cálculo o capacidad como una nueva función que interactuase con el resto de funciones y así podrías, hacer complejos cálculos de modelos lineales, univariante, multivariante, contrastes de hipótesis, intervalos de confianza, test ANOVA, ANCOVA....pero para hacer todo eso en un programa para android debo pasar por el aro de Java, lenguaje con el que llevo un par de meses y que muchas veces despierta en mí la necesidad de golpear el monitor con un mazo.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)