Das Verhalten wurde in 3.0 geändert. Von What's new in Commons Lang 3.0?:
StringUtils.isAlpha, isNumeric und isAlphanumeric jetzt alle return false, wenn ein leerer String übergeben. Zuvor waren sie wieder wahr.
Halten alte Antwort unten, als Referenz und für Benutzer vor 3.0.
Ist das logisch nicht wahr?
Wir haben
- das Verhalten der Methode
- die Dokumentation der Methode
- den Namen der Methode (die oft als die Spezifikation oder Vertrag betrachtet wird)
In diesem Fall stimmen 1 und 2 überein; Alle Zeichen in der leeren Zeichenfolge sind Unicode-Ziffern. (Oder äquivalent, keine Zeichen in der leeren Zeichenfolge sind nicht Unicode-Ziffern.) Das, was Logiker vacuously true aufrufen und etwas entgegengesetzte intuitiv. Es ist, als ob man sagt, dass alle Elefanten in meiner Wohnung sind grün. Es stimmt, denn in meiner Wohnung gibt es keine Elefanten.
Item 3 jedoch (der Name der Methode) wird natürlich als eine Methode interpretiert, die wahr zurückgibt, wenn die angegebene Zeichenfolge eine Zahl darstellt.
Also, entweder ist es ein Dokumentations- und Implementierungsfehler, oder es ist ein Namensfehler. Darauf gibt es keine richtige oder falsche Antwort.
Ein Fehler wurde here eingereicht. Die Betreuer nehmen den Standpunkt ein, dass das Verhalten beabsichtigt ist.
Warum sehen sie leere Zeichenfolge als numerisch?
Während der Name des Verfahrens Sie führen zu glauben, sollte die Methode nur für Strings true zurück, die eine Zahl darstellt, sagt der spec es tatsächlich für wahr zurückgeben sollte, wenn die Zeichenfolge enthält nur Unicode-Zeichen.
Sie sagen,
Ich bin verwirrt, weil Spezifikation sagt: "Prüft, ob der String nur Unicode-Ziffern enthält." Ich sehe nicht, dass „“ Ziffern enthält ....
Beachten Sie, dass die leere Zeichenkette nichts anderes als Unicode-Ziffern enthält. Daher gibt die Methode true zurück.
Zitat von der Verbindung, die Sie gaben: "Eine leere Schnur hat keine Charaktere, also kann kein ungültiges Zeichen enthalten." .... deshalb warum es ein annehmbares Verhalten ist. –
Aber es enthält auch keinen rechtlichen Charakter. Ein Typ fragte eine vernünftige Frage in Kommentaren: "Vielleicht könnte die Methode besser isNotNonNumeric() heißen?" Ich stimme 100% mit ihm überein. Mein Punkt ist ... Wenn "17" + "256" geschrieben werden soll - alles ist klar ... aber "" + "256" ... naja ... Leere Zeichenkette sollte nicht als irgendeine Ziffer betrachtet werden, entweder 0 oder 1 oder etwas anderes. –
Ich stimme zu. Der Name der Funktion ist leicht irreführend und unglücklich. Es könnte zum Beispiel 'containsOnlyDigits' oder' isNotNonNumeric' heißen, wie Sie vorschlagen. Es gibt einige Überraschungen wie diese in Bezug auf die leere Zeichenfolge. Würden Sie zum Beispiel sagen, dass eine leere Zeichenfolge jemals etwas enthält? Das heißt, sollte "" (.....) 'jemals als wahr gelten? Nun, das tut es! (Ich werde es als eine Übung für Sie überlassen, um herauszufinden, wie;) Sie müssen sich nur daran gewöhnen, sollen wir "nicht intuitive Eigenschaften" der leeren Saite sagen. – aioobe