2016. szeptember 27., kedd

Different ways to use assertions in Java code



In order to create a clean and save code, I prefer implement as many state checks in my code, as possible or necessary.

If a state check fails, you usually want to throw an exception and stop processing the current business step. Failure in state check is always a sign of an implementation problem. As this kind of problems should be found in your test phase, your end user must not face with this kind of exceptions.

You should consider using assertion in the following situations:
  • Parameter check of the non private methods used by your own components.  
  • As it is stated in the many programming design guides, you always need to check parameters of a public method. It helps to provide a clean API and makes your code safer.
  • Check the state of your object before start to execute a critical operation.
It is also an advantage of assertions, that they can be considered as "active comments" in the code. Using assertions with appropriate error message documents the code, and has a well defined functionality at the same time. Assertions also help to test the API contract by writing Unit test direct against them.

You should carefully consider using assertions in following situations:
  • Checking parameters of private methods. In most cases unnecessary, as the caller of the method can be controlled by you.
  • Check returned objects from other software components, treating them as they would be an input to your component. As the connection and returned objects can be dependent of the environment, it does not necessary indicates a programming error if they are not in an appropriate state. In such situations throw a business exception instead. 

You have following ways to implement assertions

Simple Java check

Implementing the state check with a normal Java code, and throw the appropriate exception, when it fails.

Advantages
  1. You are not bound to a specific framework. 
  2. You can throw any kind of exception, depending of the situation. 
  3. You can implement your own Exception (preferably as a subclass of RuntimeEcxeption), and use it for validations. You can implement the appropriate exception handling for validation problems, make it possible for example to log them separately. You can even inform the developers about problems in production environment.

Disadvantages
  1. You are repeating yourself in the code. 
  2. In a team, all members will implement their own validation, with different, ad hoc Exceptions, and they will tend to forget adding meaningful messages to the exceptions.
  3. You do not have a common way to handle validation failures, as any kind of exception can be thrown. 
  4. Therefore you will soon start to implement your own little framework for validating the state, which is the root of the evil :) 

Java assertion



 public void setRefreshInterval(int interval) {
    // validate input parameter
    assert interval > 0 && interval <= 1000/MAX_REFRESH_RATE : interval;


Advantages
  1. The check is done only in test or development environment, which makes the production code slightly faster.
  2. AssertionError must not be cought, also it does not require additional code to handle it.
Disadvantages
  1. The check is done only in test or development environment, which makes problems, that not found during the acceptance very dangerous. Casing exceptions (if you are lucky) or incorrect business operations (if you are not so lucky)
  2. It is not always obvious to run unit tests with assertions enabled. However in case of Maven's Surefire plugin, assertions are swithced on by default, you need to check this when using other build tools.
    Starting Unit test with assertions enabled from a development tool, like Eclipse is also not convenient.  

Guava Preconditions class

Using the Preconditions class from Guava framework makes it easy to define simple validation rules. It has however not too much methods to be used.

Advantages
  1. Single utility class to validate conditions
Disadvantages
  1. A small set of validation methods

Commons Validate class

Using the Validate class makes it easy to implement validation rules. Its convenient methods are easy to use, and have a very easy to read naming convention.

Advantages
  1. Works with older Java versions as well.
  2. Lots of methods to check null values, collections, ranges, special checks for Strings.
  3. Continuously growing set of methods
Disadvantages
  1. Validation can not be restricted to test evironment
  2. There is no possibility to inform the developer, when problem occures in production.
Sources
http://www.cnblogs.com/rollenholt/p/3655511.html
http://stackoverflow.com/questions/5172948/should-we-always-check-each-parameter-of-method-in-java-for-null-in-the-first-li























Nincsenek megjegyzések:

Megjegyzés küldése