El segundo ejemplo es claramente superior. El significado del segundo ejemplo es inmediatamente obvio cuando miras el código. El significado del primer ejemplo solo es obvio si ha memorizado toda la tabla ASCII en su cabeza.
Debes distinguir entre la comprobación de un carácter específico o la comprobación de un rango o clase de caracteres.
1) Buscando un personaje específico.
Para caracteres comunes, use el literal de carácter, por ejemplo, if(ch=='z')...
. Si verifica contra caracteres especiales como tabulaciones o saltos de línea, debe usar los escapes, como if (ch=='\n')...
. Si el carácter que está verificando es inusual (por ejemplo, no es reconocible inmediatamente o no está disponible en un teclado estándar), puede usar un código de carácter hexadecimal en lugar del carácter literal. Pero como un código hexadecimal es un "valor mágico", lo extraerías a una constante y lo documentarías:
const char snowman = 0x2603; // snowman char used to detect encoding issues
...
if (ch==showman)...
Los códigos hexadecimales son la forma estándar de especificar códigos de caracteres.
2) Buscando una clase o rango de caracteres
Realmente no deberías estar haciendo esto directamente en el código de la aplicación, pero deberías encapsularlo en una clase separada que solo tenga que ver con la clasificación de caracteres. Y debería variar esto, ya que las bibliotecas ya existen para este propósito, y la clasificación de caracteres suele ser más compleja de lo que cree, al menos si considera caracteres fuera del rango ASCII.
Si solo le preocupan los caracteres en el rango ASCII, puede usar literales de caracteres en esta biblioteca, de lo contrario probablemente usaría literales hexadecimales. Si observa el código fuente de la biblioteca de caracteres incorporada de Java, también hace referencia a los valores de los caracteres y los rangos que usan hexadecimales, ya que así se especifican en el estándar de Unicode.