El retorno nulo; es necesario ya que se puede capturar una excepción, sin embargo, en tal caso, dado que ya verificamos si era nulo (y supongamos que sabemos que la clase a la que llamamos admite la clonación), por lo que sabemos que la declaración try nunca fallará.
Si conoce los detalles sobre las entradas involucradas de una manera en la que sabe que la try
declaración nunca puede fallar, ¿cuál es el punto de tenerla? Evite el try
si está seguro de que las cosas siempre van a tener éxito (aunque es raro que pueda estar absolutamente seguro durante toda la vida útil de su base de código).
En cualquier caso, el compilador desafortunadamente no es un lector de mentes. Ve la función y sus entradas, y dada la información que tiene, necesita esa return
declaración en la parte inferior tal como la tiene.
¿Es una mala práctica poner la declaración de retorno adicional al final solo para satisfacer la sintaxis y evitar errores de compilación (con un comentario que explique que no se alcanzará), o hay una mejor manera de codificar algo como esto para que el extra ¿La declaración de devolución es innecesaria?
Todo lo contrario, sugeriría que es una buena práctica evitar las advertencias del compilador, por ejemplo, incluso si eso cuesta otra línea de código. No se preocupe demasiado por el recuento de líneas aquí. Establezca la confiabilidad de la función a través de pruebas y luego continúe. Simplemente fingiendo que podría omitir la return
declaración, imagine volver a ese código un año después y luego tratar de decidir si esa return
declaración en la parte inferior va a causar más confusión que un comentario que detalla los detalles de por qué se omitió debido a suposiciones que puede hacer sobre los parámetros de entrada. Lo más probable es que la return
declaración sea más fácil de manejar.
Dicho esto, específicamente sobre esta parte:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Creo que hay algo un poco extraño con la mentalidad de manejo de excepciones aquí. Por lo general, desea aceptar las excepciones en un sitio donde tiene algo significativo que puede hacer en respuesta.
Puede pensar try/catch
en un mecanismo de transacción. try
Al realizar estos cambios, si fallan y nos ramificamos en el catch
bloque, haga esto (lo que sea que esté en el catch
bloque) en respuesta como parte del proceso de reversión y recuperación.
En este caso, simplemente imprimir un seguimiento de pila y luego verse obligado a devolver un valor nulo no es exactamente una mentalidad de transacción / recuperación. El código transfiere la responsabilidad del manejo de errores a todas las llamadas de código getClone
para verificar manualmente las fallas. Quizás prefieras atrapar elCloneNotSupportedException
y traducirlo a otra forma de excepción más significativa y lanzarla, pero no desea simplemente tragarse la excepción y devolver un nulo en este caso, ya que no es como un sitio de recuperación de transacciones.
Terminará por filtrar las responsabilidades a las personas que llaman para verificar manualmente y tratar la falla de esa manera, cuando lanzar una excepción evitaría esto.
Es como si cargaras un archivo, esa es la transacción de alto nivel. Puede que tengas un try/catch
ahí. Durante el proceso de trying
carga de un archivo, puede clonar objetos. Si hay una falla en cualquier parte de esta operación de alto nivel (cargando el archivo), normalmente querrá lanzar excepciones hasta este try/catch
bloque de transacciones de nivel superior para que pueda recuperarse con gracia de una falla al cargar un archivo (ya sea debido a un error en la clonación o cualquier otra cosa). Por lo tanto, generalmente no queremos tragarnos una excepción en un lugar granular como este y luego devolver un valor nulo, por ejemplo, ya que eso anularía gran parte del valor y el propósito de las excepciones. En su lugar, queremos propagar las excepciones hasta un sitio donde podamos tratarlas de manera significativa.
Object
parámetro. Sia
no es una clase que admita elclone
método (¿o está definido en estoObject
?) O si ocurre un error durante elclone
método (o cualquier otro error que no se me ocurra en este momento), se podría lanzar una excepción y alcanzaría la declaración de devolución.