Enfoque # 3:arg.getClass();
es inteligente, pero a no ser que este lenguaje ver adopción generalizada, prefiero los métodos más claras, más prolija en lugar de ahorrar unos cuantos caracteres. Soy un programador de "escribir una vez, leer muchos".
Los otros enfoques son autodocumentados: hay un mensaje de registro que puede usar para aclarar lo sucedido: este mensaje de registro se utiliza al leer el código y también en tiempo de ejecución. arg.getClass()
, tal como está, no es autodocumentado. Se puede usar un comentario o al menos aclarar a los colaboradores del código:
arg.getClass(); // null check
Pero aún así no tener la oportunidad de poner un mensaje específico en el tiempo de ejecución como se hace con los otros métodos.
Enfoque # 1 vs # 2 (null-cheque + NPE/IAE vs afirman): trato de seguir las directrices de la siguiente manera:
http://data.opengeo.org/GEOT-290810-1755-708.pdf
Use assert
para verificar los parámetros en métodos privados
assert param > 0;
Uso cheque nulo + IllegalArgumentException
para comprobar los parámetros de métodos públicos
if (param == null) throw new IllegalArgumentException("param cannot be null");
Uso cheque nulo + NullPointerException cuando sea necesario
if (getChild() == null) throw new NullPointerException("node must have children");
Sin embargo, ya que esta es la pregunta puede ser acerca de la captura potenciales null
temas más eficiente, entonces tengo que hablar de mi método preferido para hacer frente a null
está utilizando el análisis estático, por ejemplo, escriba anotaciones (por ejemplo, @NonNull
) a la JSR-305. Mi herramienta favorita para el control de ellas es:
El Marco Checker:
tipos conectable personalizado para Java
https://checkerframework.org/manual/#checker-guarantees
Si es mi proyecto (por ejemplo, no una biblioteca con una API pública) y si puedo utilizar el Marco corrector largo:
puedo documentar mi intención con mayor claridad en la API (por ejemplo, este parámetro no puede ser nulo (por defecto), pero éste puede ser nulo (@Nullable
; el método puede devolver null; etc.) Esta anotación es correcta en la declaración, en lugar de más lejos en el Javadoc, por lo que es mucho más probable que se mantenga.
análisis estático es más eficiente que cualquier cheque de tiempo de ejecución
análisis estático marcará potenciales defectos de lógica de antelación (por ejemplo, que trató de pasar una variable que puede ser nulo a un método que sólo acepta un parámetro no nulo) en lugar de depender del problema que ocurre en el tiempo de ejecución.
Otra ventaja es que la herramienta me permite poner las anotaciones en un comentario (por ejemplo, `/ @Nullable/), por lo que mi código de la biblioteca puede anotado tipo no compatible con los proyectos de tipo-anotada y proyectos (no es que tenga ninguno de estos).
En caso de que el enlace va muertos, aquí está la sección de Guía GeoTools Desarrollador:
http://data.opengeo.org/GEOT-290810-1755-708.pdf
5.1.7 Uso de las afirmaciones, IllegalArgumentException y NPE
El lenguaje Java desde hace un par de años ahora hace que una palabra clave assert esté disponible; esta palabra clave se puede usar para realizar solo comprobaciones de depuración. Si bien hay varios usos de esta instalación, uno común es verificar los parámetros del método en métodos privados (no públicos). Otros usos son post-condiciones e invariantes.
Referencia:Programming With Assertions
condiciones previas (como cheques de argumentos en los métodos privados) son objetivos típicamente fáciles para afirmaciones. Las condiciones posteriores e invariantes son en algún momento menos directas pero más valiosas, ya que las condiciones no triviales tienen más riesgos de romperse.
- Ejemplo 1: Después de un mapa de proyección en el módulo de referencia, una afirmación realiza la proyección del mapa inversa y comprueba el resultado con el punto original (post-condición).
- Ejemplo 2: En implementaciones de DirectPosition.equals (Objeto), si el resultado es verdadero, la aserción asegura que hashCode() son idénticos a los requeridos por el contrato de objeto.
Uso Assert para comprobar los parámetros en los métodos privados
private double scale(int scaleDenominator){
assert scaleDenominator > 0;
return 1/(double) scaleDenominator;
}
Puede activar afirmaciones con el siguiente parámetro de línea de comando:
java -ea MyApp
Se puede activar sólo GeoTools afirmaciones con la siguiente Parámetro de línea de comando:
java -ea:org.geotools MyApp
Puede desactivar las afirmaciones de un paquete específico como se muestra aquí:
java -ea:org.geotools -da:org.geotools.referencing MyApp
Use IllegalArgumentExceptions a comprobar los parámetros de Métodos públicos
El uso de métodos afirma el público no se recomienda estrictamente; porque el error que se informa ha sido hecho en el código del cliente - sea honesto y dígales por adelantado con una IllegalArgumentException cuando se hayan equivocado.
public double toScale(int scaleDenominator){
if(scaleDenominator > 0){
throw new IllegalArgumentException("scaleDenominator must be greater than 0");
}
return 1/(double) scaleDenominator;
}
Uso NullPointerException cuando sea necesario
Si es posible llevar a cabo sus propios cheques nulos; lanzando una IllegalArgumentException o NullPointerException con información detallada sobre lo que salió mal.
public double toScale(Integer scaleDenominator){
if(scaleDenominator == null){
throw new NullPointerException("scaleDenominator must be provided");
}
if(scaleDenominator > 0){
throw new IllegalArgumentException("scaleDenominator must be greater than 0");
}
return 1/(double) scaleDenominator;
}
Soy un fanático del enfoque de verificación estática. ¿Cómo lidiar con el problema de las bibliotecas de terceros que no proporcionan tales anotaciones? ¿Se puede anular todo por defecto? ¿Todo no es nulo por defecto? ¿Puedes hacer modificaciones específicas de este valor predeterminado? –
@Martinho - Dos enfoques: (1) ignórelo porque el predeterminado funciona para la mayoría de los parámetros/métodos, y el uso puede usar 'SuppressWarnings' para manejar el resto, y (2) la herramienta proporciona una manera de anotar una biblioteca de terceros por separado . –