The Position class is (although probably good design) quite redundant: you construct an array of Position objects, of which the row (first argument of the constructor) is always the same as the index in the array. In effect the int array queens
at that point already contains all information for the solution. The conversion to Positions doesn't add any information, is redundant and the performance would increase (marginally) by removing it.
EDIT:
The candidates
array is static for each problem size: no need to pass it to the search
method, if you would create a SolutionFinder
class that is specialized for a particular problem size. Now the candidates can be final state in an instance of this class, the solve
and search
methods become simpler. Not sure if this would impact performance.