¿Cuándo debería usar Apache Commons 'Validate.isTrue, y cuándo debería usar la palabra clave' assert '?¿Cuándo debería usar Apache Commons 'Validate.isTrue, y cuándo debo usar la palabra clave' assert '?
¿Cuándo debería usar Apache Commons 'Validate.isTrue, y cuándo debo usar la palabra clave' assert '?
Respuesta
Las aserciones se pueden desactivar (de hecho, normalmente lo están), por lo que no son útiles para validar la entrada del usuario, por ejemplo.
Validate.is True y 'assert' sirven para fines completamente diferentes.
afirman
declaraciones de aserción de Java se utilizan normalmente para la documentación (por medio de afirmaciones ) bajo qué circunstancias métodos pueden ser invocadas, y lo que sus interlocutores pueden esperar para ser verdad después. Las aserciones pueden ser opcionalmente verificadas en tiempo de ejecución, lo que resulta en una excepción AssertionError si no son válidas.
En términos de diseño por contrato, las aserciones se pueden usar para definir las pre y postcondiciones , así como las invariantes de clase. Si en el tiempo de ejecución se detecta que no se mantienen, esto apunta a un problema de diseño 0 implementación en el sistema.
Validate.isTrue
org.apache.commons.lang.Validate es diferente. Ofrece un conjunto simple de métodos similares a JUnit que verifican una condición y lanzan una "excepción de objeto ilegal" si la condición no se cumple.
Normalmente se utiliza cuando una API pública debe tolerar la entrada incorrecta . En ese caso, su contrato puede prometer arrojar una IllegalArgumentException en una entrada errónea. Apache Validate ofrece una abreviatura conveniente para implementar esto.
Dado que se emite una IllegalArgumentException, no tiene sentido que use Apache's Validate para verificar las postcondiciones o invariantes. Del mismo modo, es incorrecto utilizar 'assert' para la validación de la entrada del usuario, , ya que la verificación de la afirmación puede desactivarse en tiempo de ejecución.
El uso de ambos
Es posible, sin embargo, utilizar ambos al mismo tiempo, aunque para diferentes propósitos. En este caso, el contrato debe explícitamente requerir que IllegalArgumentException se levante con ciertos tipos de entrada. Esto se implementa a través de Apache Validate. Los invariantes y las postcondiciones simplemente se afirman, así como como posibles precondiciones adicionales (por ejemplo, afectando el estado del objeto). Por ejemplo:
public int m(int n) {
// the class invariant should hold upon entry;
assert this.invariant() : "The invariant should hold.";
// a precondition in terms of design-by-contract
assert this.isInitialized() : "m can only be invoked after initialization.";
// Implement a tolerant contract ensuring reasonable response upon n <= 0:
// simply raise an illegal argument exception.
Validate.isTrue(n > 0, "n should be positive");
// the actual computation.
int result = complexMathUnderTrickyCircumstances(n);
// the postcondition.
assert result > 0 : "m's result is always greater than 0.";
assert this.processingDone() : "processingDone state entered after m.";
assert this.invariant() : "Luckily the invariant still holds as well.";
return result;
}
Más información:
- Bertrand Meyer, "Aplicación de Diseño por contrato", IEEE Computer, 1992 (pdf)
- Johsua Bloch. Effective Java, 2nd ed., Item 38. Comprueba los parámetros de validez.(google books)
Johsua Bloch. * Effective Java *, Item 23: Comprueba los parámetros de validez. – artdanil
@thilo es el adecuado para afirmar palabra clave, pero tenga en cuenta por la afirmación como la aserción de primavera.
Ver ConditionalFailuresExplained de guayaba.
- Condición previa "en mal estado (el que llama)."
- aserción "metí la pata."
- Verificación "Alguien que dependo en mal estado."
- 1. ¿Cuándo debería usar la palabra clave "self"?
- 2. ¿Cuándo debería usar la palabra clave "this" en C++?
- 3. Cuándo usar assert() y cuándo usar try catch?
- 4. ¿Cuándo debería usar la palabra clave "strictfp" en java?
- 5. ¿Cuándo debería usar TCP_NODELAY y cuándo TCP_CORK?
- 6. En SQL Server, ¿cuándo debería usar GO y cuándo debería usar punto y coma?
- 7. ¿Cuándo debería usar Silverlight y cuándo XNA?
- 8. ¿Cuándo NO DE USAR esta palabra clave?
- 9. Cuándo debería usar SynchronousQueue
- 10. ¿Cuándo debería usar GC.SuppressFinalize()?
- 11. ¿Cuándo debería usar CompiledQuery?
- 12. ¿Cuándo debo usar adornos?
- 13. ¿Cuándo debería usar require() y cuándo usar define()?
- 14. ¿Cuándo debería usar Sql Azure y cuándo debo usar Table Storage?
- 15. ¿Cuándo debería usar _aligned_malloc()?
- 16. ¿Cuándo debería usar semáforos?
- 17. ¿Cuándo debo usar cuaterniones?
- 18. Cuándo usar Pepino y cuándo usar RSpec?
- 19. ¿Cuándo debería usar ConcurrentSkipListMap?
- 20. C# ¿Cuándo debería usar List y cuándo debería usar el arraylist?
- 21. ¿Cuándo debería usar async/await y cuándo no?
- 22. Cuándo usar undef_method, y cuándo usar remove_method?
- 23. ¿Cuándo debería usar std_logic_vector y cuándo debería usar otros tipos de datos?
- 24. ¿Cuándo debería usar Import-Package y cuándo debería usar Require-Bundle?
- 25. ¿Cuándo debo usar los hilos?
- 26. Cuándo y dónde debo usar WCF
- 27. Mejores prácticas: atributo XML vs elemento XML: ¿cuándo debo usar elementos y cuándo debo usar atributos?
- 28. ¿Cuándo debo usar los bloques Begin/End y la palabra clave Go en SQL Server?
- 29. ¿Cuándo necesitaría usar la palabra clave stackalloc en C#?
- 30. ¿Cuándo se debe usar la palabra clave volátil en C#?
posible duplicado de [On Afirma y excepciones; Java] (http://stackoverflow.com/questions/4863694/on-asserts-and-exceptions-java) –