una tipos tener puede parametros otra metodo llamar herencia desde cuantos constructores con como clase java constructor methods call this

java - tipos - Usando ''esto'' como parámetro para una llamada a un método en un constructor



super en java (11)

"esto" nunca debería ser nulo. ¿Estás seguro de que se está lanzando la excepción por eso?

Algo de lo que hay que tener cuidado es que si el método es virtual o llama a cualquier método virtual, entonces se puede ejecutar un método perteneciente a una subclase antes de que se inicialicen las variables de la subclase.

Tengo un constructor como el siguiente:

public Agent(){ this.name = "John"; this.id = 9; this.setTopWorldAgent(this, "Top_World_Agent", true); }

Obtengo una excepción de puntero nulo aquí en la llamada al método. Parece ser porque estoy usando ''esto'' como argumento en el método setTopWorldAgent. Al eliminar este método, llamar a todo parece estar bien. ¿Por qué pasó esto? Alguien más ha experimentado esto?


¿Por qué setTopWorldAgent necesita this como argumento? En función de la invocación, se trata de un método de instancia, por lo que podría hacer referencia a this sin necesidad de recibirlo como parámetro.


Creo más al punto, ¿por qué diablos estás pasando ''esto'' como un parámetro a un método en ''esto''?

Lo siguiente pondría a prueba lo que dices que te está sucediendo y no tengo problemas con él.

public class Test { public Test() { this.hi(this); } public void hi(Test t) { System.out.println(t); } public static void main(String[] args) throws Exception { Test t = new Test(); } }


Dado que setTopWorldAgent parece ser un método de instancia, ¿por qué estás pasando por esto de todos modos?


El error debe estar en otro lugar porque el código anterior definitivamente funciona, la referencia nula debe ser otra cosa.


Las reglas de Java establecen que nunca se debe pasar ''esto'' a otro método desde su constructor, por la sencilla razón de que el objeto no se ha construido por completo. El objeto al que hace referencia puede estar en un estado inconsistente. Me sorprende que la referencia real "this" sea nula, pero en absoluto sorprendida de que algún miembro de "this" sea nulo cuando se pasa a setTopWorldAgent, y que el método arroja la excepción debido a esto.

Por lo general, puede salirse con la suya al pasar ''esto'' de los constructores, siempre y cuando no acceda a ningún miembro o llame a métodos, por ejemplo, si desea establecer una referencia a ''esto'' en otro objeto.

En este caso, por supuesto, el argumento es innecesario ya que el método ya tiene una referencia a ''esto''.


Por curiosidad, ¿por qué pasas ''esto'' a una función miembro de la misma clase? setTopWorldAgent () puede usar ''this'' directamente. No parece que tu constructor o setTopWorldAgent () sean estáticos, así que no estoy seguro de por qué pasarías una función de miembro a la que ya tiene acceso.

A menos que me esté perdiendo algo ...


Si su agente está implementando ITopWorldAgent, debería hacerlo:

Agent agent = new Agent("John", 9); agent.setTopWorldAgent(agent, "Top_World_Agent", true);

Si no, ¿por qué estás configurando algo de la manera que eres?

Supongo que algo en el método setTopWorldAgent usa un valor que aún no se ha inicializado en su constructor.


this no es nulo, eso es seguro. Ha sido asignado.

Dicho esto, no es necesario pasar this al método, está automáticamente disponible en todos los métodos de instancia. Si el método es estático, es posible que desee refactorizarlo en un método de instancia.


Puede pasar esto a métodos, pero setTopWorldAgent () no puede ser abstracto. No puedes hacer una llamada virtual en el constructor.

En el constructor de un objeto, puede invocar métodos definidos en ese objeto o clases base, pero no puede esperar llamar a algo que será proporcionado por una clase derivada, porque partes de la clase derivada aún no están construidas. Hubiera esperado algún tipo de error de compilación si setTopWorldAgent () fuera abstracto.

En Java, puede obtener un comportamiento sorprendente con el contructor y las clases derivadas; aquí hay un ejemplo

http://en.wikipedia.org/wiki/Virtual_functions#Java_3

Si está acostumbrado a C # o C ++, puede pensar que es seguro llamar a las funciones virtuales y no llamar a las que están anuladas. En Java, la llamada virtual se realiza aunque la clase derivada no esté completamente construida.

Si esto no es lo que está sucediendo, entonces presumiblemente, todas las partes de esto que setTopWorldAgent () necesita se inicializan; de lo contrario, es probable que sea uno de los miembros de esto que deba inicializarse.

Editar: pensó que esto era C #


Me alegra que hayas respondido. Me gustaría agregar que pasar ''esto'' como parámetro puede conducir a problemas inesperados de concurrencia. Básicamente está brindando la posibilidad de que el estado del objeto sea manipulado de manera insegura por medio de un código potencialmente no seguro para hilos.