Je ne suis pas sûr que le code que vous lisiez était de haute qualité (j'ai examiné quelques codes de bioinformatique dans le passé et il est malheureusement souvent écrit par des développeurs non professionnels). Par exemple, ce troisième constructeur n'est pas un constructeur de copie et en général, il y a des problèmes dans ce code, donc je ne le prendrais pas trop à la lettre.
Le premier constructeur est un constructeur par défaut. Il initialise seulement le strict minimum et permet aux utilisateurs de paramétrer le reste avec des getters et des setters. Les autres constructeurs sont souvent des "constructeurs de commodité" qui aident à créer des objets avec moins d'appels. Cependant, cela peut souvent conduire à des incohérences entre les constructeurs. En fait, il existe des recherches récentes qui montrent qu'un constructeur par défaut avec des appels ultérieurs aux setters est préférable.
Il y a aussi des cas où un constructeur par défaut est essentiel. Par exemple, certains frameworks comme digester (utilisé pour créer des objets directement à partir de XML) utilisent des constructeurs par défaut. Les JavaBeans en général utilisent des constructeurs par défaut, etc.
De plus, certaines classes héritent d'autres classes. Vous pouvez voir un constructeur par défaut lorsque l'initialisation de l'objet parent est "suffisante".
Dans ce cas spécifique, si ce constructeur n'était pas défini, il faudrait connaître tous les détails à l'avance. Ce n'est pas toujours préférable.
Enfin, certains IDE génèrent automatiquement un constructeur par défaut, il est possible que la personne qui a écrit la classe ait eu peur de l'éliminer.