TransWikia.com

¿Como dar la misma implementacion a un método en dos clases anónimas en java?

Stack Overflow en español Asked on November 24, 2021

hola comunidad de desarrolladores, quiero implementar un mismo método en dos clases anónimas para ahorrarme escribir varias veces este método, el algoritmo es un poco mas complejo pero quiero dar un ejemplo con este:

public class MainActivity extends AppCompatActivity {

    interface $miinterfaz{
        void primero(Integer entero);
        void segundo();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        $miinterfaz inter1=new $miinterfaz(){//primera clase anónima

            @Override
            public void primero(Integer entero) {
                int nuevoentero=entero+10;//aca solo le sumo 10
                Log.i("este metodo cambia","entero = "+nuevoentero);
            }

            @Override
            public void segundo() {
                Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");//este mensaje es igual en los dos casos
            }
        };
        $miinterfaz inter2=new $miinterfaz(){//segunda clase anónima

            @Override
            public void primero(Integer entero) {
                int nuevoentero=entero+50;//aquí es diferente el calculo sumándole 50
                Log.i("este metodo cambia","entero = "+nuevoentero);
            }

            @Override
            public void segundo() {
                Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
            }
        };
        
        ejecutar(inter1);
        ejecutar(inter2);
    }
    public void ejecutar($miinterfaz inter){
        inter.primero(8);
        inter.segundo();
    }
}

entonces la pregunta es ¿como copio el segundo método en la otra clase anónima? o si existe otra técnica para evitar escribir varias veces este método pero teniendo en cuenta que el primero si cambia
asi queda el log:

I/este metodo cambia: entero = 18
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 58
I/este metodo es el mismo: solo quiero imprimir este mensaje

3 Answers

utilizando una clase interna e implementando la interfaz pude dejar sobreescrita(override) la función que no es dinámica y cambiarla que si en cada instancia

public class MainActivity extends AppCompatActivity {

    interface $miinterfaz{
        void primero(Integer entero);
        void segundo();
    }
    // clase que implementa el método -> NombreClase.java
    class nuevaclase implements $miinterfaz {

        @Override
        public void primero(Integer entero) {
            //este metodo se sobreescribe
        }

        @Override
        public void segundo() {
            Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        $miinterfaz inter1=new nuevaclase(){
            @Override
            public void primero (Integer entero){
                int nuevoentero = entero + 10;
                Log.i("este metodo cambia", "entero = " + nuevoentero);
            }
        };
        $miinterfaz inter2=new nuevaclase(){
            @Override
            public void primero (Integer entero){
                int nuevoentero = entero + 50;
                Log.i("este metodo cambia", "entero = " + nuevoentero);
            }
        };
        $miinterfaz inter3=new nuevaclase(){
            @Override
            public void primero (Integer entero){
                int nuevoentero = entero + 98;
                Log.i("este metodo cambia", "entero = " + nuevoentero);
            }
        };
        $miinterfaz inter4=new nuevaclase(){
            @Override
            public void primero (Integer entero){
                int nuevoentero = entero + 40;
                Log.i("este metodo cambia", "entero = " + nuevoentero);
            }
        };
        ejecutar(inter1);
        ejecutar(inter2);
        ejecutar(inter3);
        ejecutar(inter4);
    }
    public void ejecutar($miinterfaz inter){
        inter.primero(8);
        inter.segundo();
    }
}

este es el log

I/este metodo cambia: entero = 18
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 58
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 106
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 48
I/este metodo es el mismo: solo quiero imprimir este mensaje

Answered by junior on November 24, 2021

Lo que crea la necesidad de hacer dos instancias solamente es el valor del incremento. Si se pasa el incremento como un parámetro de la función primero() no se necesitan dos instancias diferentes.

 interface $miinterfaz{
          void primero(Integer entero, Integer incremento);
          void segundo();
    }

Crear una sola instancia

$miinterfaz inter1 = new $miinterfaz(){

            @Override
            public void primero(Integer entero, Integer incremento) {
                int nuevoentero =entero + incremento;
            }

            @Override
            public void segundo() {
                Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
            }
        };

Answered by Lobos on November 24, 2021

Dado que las interfaces solo son las firmas de los métodos, y lo que requieres es la implementación de un método. Lo que yo haría sería una clase que implemente una interfaz con el método requerido y ahí escribiría la implementación del método. De esa manera me evitaría estar sobreescribiendo el método de la interfaz cada que la use.

// miinterfaz.java
interface $miinterfaz {
    void segundo();
}

// clase que implementa el método -> NombreClase.java
class NombreClase implements $miinterfaz {
    @Override
    private segundo() {
    // El código que vas a llamar varias veces va aquí
    }
}

//en el MainActivity 

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        $miinterfaz miinterfaz = new NombreClase();
        miinterfaz.segundo();
    }
}

Espero haberme dado a entender.

Answered by user2028118 on November 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP