Ao contrário de C, onde você não pode iniciar um thread com vários argumentos (pthread void ** param: D), o encadeamento Java apenas permite executar o método run
sem argumento. (veja link obrigado @RobertHarvey).
Você não tem escolha de usar o campo para passar o parâmetro para um Thread.
No entanto, você pode dissociar o DeviceDriver de seu aspecto de thread, já que no lado abstrato, o DevideDriver não é necessariamente um thread.
Assim, você pode mover o método run()
de DeviceDriver para um DeviceDriverThread e adicionar uma execução de método (fila MessageQueue) a DeviceDriver
Este DeviceDriverThread tomará como campos o MessageQueue e o concret DeviceDriver para executar e este método executado fará o seguinte:
private MessageQueue queue;
private DeviceDriver deviceDriver;
public void run(){
deviceDriver.run(queue);
}
Eu acho que você precisará do método parar em DevideDriverThread também.
Pense nisso como um simples padrão de adaptador.