Eclipse debugger, přinejmenším verze 3.4.x, povolí změnu hodnoty primitivního typu. Třídy jako
Boolean
nebo
Integer
jsou založeny na své neměnnosti. Změna fieldu má
záludný vliv na všechny místa, kde se pracuje se stejnou instancí:
final Boolean tru = Boolean.TRUE;
final Integer ONE = Integer.valueOf( 1 );
final Integer one = Integer.valueOf( 1 );
System.out.println( String.format( "value: %b, Boolean.TRUE: %b, one: %d, ONE: %d",
true, Boolean.TRUE, one, ONE ) );
// now change value of 'tru.value' to false and one.value to 0 in debugger
System.out.println( String.format( "value: %b, Boolean.TRUE: %b, one: %d, ONE: %d",
true, Boolean.TRUE, one, ONE ) );
Výstup:
value: true, Boolean.TRUE: true, one: 1, ONE: 1
value: true, Boolean.TRUE: true, one: 0, ONE: 0
Myslíte te si, že to je dobrý nápad? Autoři IntelliJ IDEA si to nemyslí a změnu nedovolí. I když se domníváte, že přesně víte, co děláte, stále se zde skrývá další problém. Změna final fieldu nemusí být viditelná ze všech běžící threadů.