Posto quello che ha scritto schumy che va benissimo,
a naso farei proprio due enum { R, D, A... } e { B, N } (per semplificare in questo caso potrebbe bastarne uno { RB, RN, DB, DN... }, anche se meno elegante), anziché le varie sottoclassi.

Qualche spunto (criptico) che potresti valutare o meno:
la stringa di esempio TNa1:
con gli enum puoi utilizzare valueOf(), di cui puoi gestire l'eventuale Eccezione;
'a' è un char, e un char può essere... un int (puoi facilmente ottenere 'a' -> 1, e l'opposto per "rileggerlo");
Character ha anche un metodo getNumericValue();
con due int, puoi definire un Point.

la scacchiera puoi rappresentarla anche con... un Rectangle(1, 1, 8, 8), che ha contains(Point).

in un enum puoi ad es. implementare un metodo (di istanza) che validi la mossa Point a -> Point b (magari un switch all'interno).

Poi il resto...