code: public void setNeighbourhoods(List<? extends Neighbourhood<? super SolutionType>> neighs){
          // synchronize with status updates
          synchronized(getStatusLock()){
              // assert idle
              assertIdle("Cannot set list of neighbourhoods.");
              // check not null
              if(neighs == null){
                  throw new NullPointerException("Can not set neighbourhoods: received null.");
              }
              // check that neighs does not contain any null elements
              for(Neighbourhood<?> n : neighs){
                  if(n == null){
                      throw new NullPointerException("Can not set neighbourhoods: neighbourhood list can not"
                                                          + " contain any null elements.");
                  }
              }
              // check not empty
              if(neighs.isEmpty()){
                  throw new IllegalArgumentException("Can not set neighbourhoods: received empty list.");
              }
              // go ahead
              this.neighs = Collections.unmodifiableList(neighs);
          }
      }
docs: Sets the list of neighbourhoods used to modify the current solution. Note that <code>neighs</code>
  can not be <code>null</code> nor empty and can not contain any <code>null</code> elements. This method
  may only be called when the search is idle. It should be used with care for searches that have already
  been run, as updating the neighbourhoods might break the execution of a restarted search that tries to
  continue from where it had arrived.
  <p>
  An unmodifiable view of the given list is stored.
  
  @throws NullPointerException if <code>neighs</code> is <code>null</code>
  or contains any <code>null</code> elements
  @throws IllegalArgumentException if <code>neighs</code> is empty
  @throws SearchException if the search is currently not idle
  @param neighs list of neighbourhoods used to modify the current solution