Java - Problema al pasar datos privados entre clases

 
Vista:
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Nicolás Esteban (7 intervenciones) el 09/01/2020 00:11:01
Hola. Estoy tratando de aplicar lo aprendido en POO en un ejercicio bastante simple, pero tengo problemas al recibir los datos privados de una clase mediante un getter. Estas son las dos formas en que intenté resolverlo.

FORMA 1

CLASE MAIN

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main  (String[] args){
        Entrada entradaN = new Entrada();
        entradaN.PedirDatos();
 
        Operaciones operacionesN = new Operaciones();
        operacionesN.MostrarResultado();
    }
}

CLASE ENTRADA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.Scanner;
 
public class Entrada {
    Scanner entrada = new Scanner(System.in);
 
    private int tipoOperacion;
    private int valor1;
    private int valor2;
    boolean error;
 
    public void PedirDatos() {
 
        do {
            try {
                System.out.println("Ingrese la operación que desea realizar");
                System.out.println("  1. Suma");
                System.out.println("  2. Resta");
                System.out.println("  3. Dividir");
                System.out.println("  4. Multiplicar");
                tipoOperacion = Integer.parseInt(entrada.nextLine());
 
                if (tipoOperacion < 1 && tipoOperacion > 4) {
                    System.out.println("Ingrese un número válido");
 
                    error = true;
                }
                else {
                    System.out.println("Ingrese el primer valor");
                    valor1 = Integer.parseInt(entrada.nextLine());
 
                    System.out.println("Ingrese el segundo valor");
                    valor2 = Integer.parseInt(entrada.nextLine());
 
                    error = false;
 
                }
            } catch (NumberFormatException e) {
                System.out.println("Debe ingresar un número");
                error = true;
            }
        } while (error == true);
    }
    public int getTipoOperacion() {
        return tipoOperacion;
    }
 
    public int getValor1() {
        return valor1;
    }
 
    public int getValor2() {
        return valor2;
    }
}

CLASE OPERACIONES

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Operaciones {
    Entrada entradaN = new Entrada();
 
    private int valor1, valor2, resultado, tipoOperacion;
    public Operaciones(){
        this.valor1 = entradaN.getValor1();
        this.valor2 = entradaN.getValor2();
        this.tipoOperacion = entradaN.getTipoOperacion();
    }
    private void Sumar(){
        resultado = valor1 + valor2;
    }
    private void Restar(){
        resultado = valor1 - valor2;
    }
    private void Dividir(){
        resultado = valor1 / valor2;
    }
    private void Multiplicar(){
        resultado = valor1 * valor2;
    }
    public void MostrarResultado(){
 
        switch (tipoOperacion){
            case 1: Sumar();
                System.out.println(resultado);
            break;
            case 2: Restar();
                System.out.println(resultado);
            break;
            case 3: Dividir();
                System.out.println(resultado);
            break;
            case 4: Multiplicar();
                System.out.println(resultado);
            break;
        }
    }
}


FORMA 2

CLASE MAIN

1
2
3
4
5
6
7
8
9
public class Main {
    public static void main  (String[] args){
        Entrada entradaN = new Entrada();
        entradaN.PedirDatos();
 
        Operaciones operacionesN = new Operaciones(entradaN.getValor1(), entradaN.getValor2(), entradaN.getTipoOperacion());
        operacionesN.MostrarResultado();
    }
}

CLASE ENTRADA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.Scanner;
 
public class Entrada {
    Scanner entrada = new Scanner(System.in);
 
    private int tipoOperacion;
    private int valor1;
    private int valor2;
    boolean error;
 
    public void PedirDatos() {
 
        do {
            try {
                System.out.println("Ingrese la operación que desea realizar");
                System.out.println("  1. Suma");
                System.out.println("  2. Resta");
                System.out.println("  3. Dividir");
                System.out.println("  4. Multiplicar");
                tipoOperacion = Integer.parseInt(entrada.nextLine());
 
                if (tipoOperacion < 1 && tipoOperacion > 4) {
                    System.out.println("Ingrese un número válido");
 
                    error = true;
                }
                else {
                    System.out.println("Ingrese el primer valor");
                    valor1 = Integer.parseInt(entrada.nextLine());
 
                    System.out.println("Ingrese el segundo valor");
                    valor2 = Integer.parseInt(entrada.nextLine());
 
                    error = false;
 
                }
            } catch (NumberFormatException e) {
                System.out.println("Debe ingresar un número");
                error = true;
            }
        } while (error == true);
    }
    public int getTipoOperacion() {
        return tipoOperacion;
    }
 
    public int getValor1() {
        return valor1;
    }
 
    public int getValor2() {
        return valor2;
    }
}

CLASE OPERACIONES

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Operaciones {
 
    private int valor1, valor2, resultado, tipoOperacion;
    public Operaciones(int valor1, int valor2, int tipoOperacion){
        this.valor1 = valor1;
        this.valor2 = valor2;
        this.tipoOperacion = tipoOperacion;
    }
    private void Sumar(){
        resultado = valor1 + valor2;
    }
    private void Restar(){
        resultado = valor1 - valor2;
    }
    private void Dividir(){
        resultado = valor1 / valor2;
    }
    private void Multiplicar(){
        resultado = valor1 * valor2;
    }
    public void MostrarResultado(){
        switch (tipoOperacion){
            case 1: Sumar();
                System.out.println(resultado);
            break;
            case 2: Restar();
                System.out.println(resultado);
            break;
            case 3: Dividir();
                System.out.println(resultado);
            break;
            case 4: Multiplicar();
                System.out.println(resultado);
            break;
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 09/01/2020 14:11:53
Si en tu Main Declaras

1
2
3
4
5
Entrada entradaN = new Entrada();// Primera Instancia de la clase Entrada
entradaN.PedirDatos();
 
Operaciones operacionesN = new Operaciones();
operacionesN.MostrarResultado();


******* Aparte en tu Clase Operaciones declaras :
Entrada entradaN = new Entrada(); // Segunda instancia de la Clase Entrada

Estás declarando 2 instancias Nuevas y diferentes de la clase Entrada ..

Porque no Intentas lo siguiente, dentro de Operaciones como ya tienes definido > Entrada entradaN = new Entrada(); <
has un contructor sin parametros que pida los datos de entradaN y y lo capturas con sus gettes...

1
2
3
4
5
6
7
Entrada entradaN = new Entrada();
public Operaciones(){
    entradaN.PedirDatos();
    this.valor1 = entradaN.getValor1;
    this.valor2 = entradaN.getValor2;
    this.tipoOperacion = entradaN.getTipoOperacion();
}


Luego en tu clase principal donde ejecutaras
1
2
Operaciones operacionesN = new Operaciones();
operacionesN.MostrarResultado();

Intentalo y me avisas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Nicolás Esteban (7 intervenciones) el 09/01/2020 18:48:37
Funciona! Ahora comprendo en lo que me estaba equivocando. Muchas gracias Franklin, con ese pequeño detalle me dejaste todo mucho más claro.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 09/01/2020 19:09:21
por nada, es un placer (y) intenté ser lo mas explicito posible.

Recuerda crear o buscar métodos para validar el String que pides, así evitas errores de conversiones, operaciones con ellos, etc
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Nicolás Esteban (7 intervenciones) el 09/01/2020 19:38:29
Disculpame, me surgió otra duda. En el caso que yo cree otra instancia de la clase Operaciones, el constructor se volverá a ejecutar y, por lo tanto, se ejecutará nuevamente el método pedir datos, cierto ? En esta situación, como hago para que no se pidan los datos nuevamente, es decir que no se ejecute nuevamente el método pedir datos ? Mi duda surge debido a que quiero hacer abstracta la clase Operaciones para aplicar polimorfismo y cuando quiero hacer una instancia de la clases hijas, vuelve nuevamente a pedir los datos, debido a que el método se encuentra en el constructor de la clase padre (Operaciones).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 09/01/2020 20:29:49
Hmmm de manera rápida se me ocurren 2 cosas y es importante mencionar que desconozco si es la mejor practica.

1.

Retira el codigo del constructor y metelo en un metodo por ejemplo llamado start();

el cual

1
2
3
4
5
6
public void start(){
entradaN.PedirDatos();
    this.valor1 = entradaN.getValor1;
    this.valor2 = entradaN.getValor2;
    this.tipoOperacion = entradaN.getTipoOperacion();
}

asi cuando definas Operaiones o = new Operaciones();
primero debas llamar al metodo o.start(); para que te solicite y guarde los datos.



2. Pero... si por ejemplo durante el mismo tiempo de ejecución ya has definido Operaciones y leido los datos, puedes volver sus metodos staticos, por lo que podrías acceder desde otra clase sin haberlo instanciado... me explico.

public static start(), public static getts,setts, etcs(estó te pedirá volver las variables del constructor igualmente Static o private static en caso ya la tengas definidas como private)

entonces...

(Ya declaraste Operciones y Operaciones.start(), por lo que tienes los datos obtenidos)

llamas a los metodos desde cualquier clase como:

1
2
3
4
5
Operaciones.Multiplicar();
/*
No estas creando un nuevo Operaciones o = new Operaciones();
directamente acceder al metodo <Multiplicar>de la clase <Operaciones>
*/

en caso de que la clase Operaciones se encuentro en otro Package o carpeta
1
2
3
4
5
6
7
8
nombre_Package.Operaciones.Multiplicar();
/*
Paquete > Clase > Metodo
Esto requiere
Import paquete.clase;
en caso que se encuentre fuera...
Por lo general La IDE te lo indica automaticamente
*/


Con este segundo metodo es muy posible un NullPointerException, ya que puedes llamar por ejemplo a Operaciones.Restar(), y los valores aun se encuentren como nulos ya que no se llamó inicialmente a start()


Creo que no me olvido de nada, pruebalo y me avisas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 09/01/2020 22:02:34
Unos minutos despues he vuelto.
Si quieres aplicar herencia, abstraccion, polimor ehmmm. tendrías que crear el Metodo (por ejemplo) start(); el cual te solicite los datos.

y con los metodos de Operaciones en Public Static, podrías

1
2
3
4
5
6
7
8
ClaseHijo hijo = new ClasePadre();
hijo.setValor(clasePadre.getValor());
/*
sería hijo.setValor(Operaciones.getValor()); o hijo.setValor(Package.Operaciones.getValor()); // así asignas un valor ya definido previamente en Padre sin necesidad de tener que llamar nuevamente al Start()
Recuerda que si accedes a los metodos y por algún motivo no has hecho Operaciones.Start();//Metodo donde ingresas los datos
te saldrá NullPointerException ya que estan nulos o no definidos.
*/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Nicolás Esteban (7 intervenciones) el 10/01/2020 00:16:08
Uff que bueno todo lo que me has explicado, te agradezco mucho el tiempo que te has tomado en responder. Lo que me queda la duda es por qué tengo que asignar los valores de la clase padre a la clase hija, si estas variables están encapsuladas como protected ¿No se supone que la clase hija las está heredando? Quizás entendí mal en las clases. Lo que pasa es que estoy aprendiendo por videos en youtube y muchas veces quedan cosas sin aclarar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 10/01/2020 00:21:28
Si creas una nueva instancia entonces traes consigo los metodos, variables y etc del padre, a menos que estos tengan un valor debes dar uso de sus metodos get....etc para asignarles, recuerda que son plantillas y a menos que estos objetos tengan definido ya un valor precios debes darselos tu mismo.

No es necesario tomar los valores de la clase padre, en tu caso tienes una clase aparte para pedir los valores, y una de Operaciones que llamas pedir valores, guardas en variables lo ingresado y dentro de Operaciones haces tus calculos.

Podrías pedir los datos en tu clase Operaciones, o dejarlo por separado, recuerda tener tu clase para validar enteros,floats, strings etcs, asi evitas errores de conversiones, logicos, etc.

Me avisas si dí por respondido tu consulta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Franklin
Val: 456
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Franklin (179 intervenciones) el 10/01/2020 12:54:24
Se que la clase hijo la puedes definir con herencia y usar el constructor con super( a , b), pero como no lo domino perfectamente para explicarte te dejo un link que quizás te ayude.

https://www.youtube.com/watch?v=iDhF7kSjHL8&list=PLaxZkGlLWHGX4hJql-ZDN1vi76slkLepT&index=8
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Nicolás Esteban (7 intervenciones) el 10/01/2020 20:17:45
Ahh ahora me quedó todo mucho más claro. La verdad te pasaste con la ayuda, me sacaste varias dudas importantes que tenía. Ahora veo el video para entender como utilizar la palabra super. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Problema al pasar datos privados entre clases

Publicado por Rodrigo (623 intervenciones) el 11/01/2020 17:39:16
Una manera alternativa es pasarle parametros a cada una de las operaciones, y que el mismo metodo retorne el valor, en vez de guardarlo internamente.

por ejemplo

1
2
3
4
5
class Operaciones {
   public static int suma(int a, int b) {
       return a + b;
   }
}

o bien, no poner los parametros explicitos, sino pasar los operandos en la clase que los lee

1
2
3
4
5
class Operaciones {
   public static int suma(Entrada entrada) {
       return entrada.valor1()  + entrada.valor2();
   }
}

Parece mas flexible asi. Puedes llamar distintas funciones y tener los resultados independientemente.
Cuando guardas el resultado de la operacion internamente, no puedes invocar otro metodo, pues si lo haces, pierdes el resultado de la operacion anterior.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar