String trim()- ja strip()-metodien ero Java 11:ssä

Lyhyesti sanottuna: strip() on ”Unicode-tietoinen” evoluutio trim():sta.

CSR : JDK-8200378

Problematiikka

String::trim on ollut olemassa Javan alkuaikojen alusta lähtien, jolloin Unicode ei ollut vielä täysin ehtinyt kehittyä nykyisin laajalti käyttämäämme standardiin.

String::trim:in käyttämä välilyönnin määritelmä on mikä tahansa koodipiste, joka on pienempi tai yhtä suuri kuin välilyönti-koodipiste (\u0020), jota yleisesti kutsutaan ASCII- tai ISO-ohjausmerkeiksi.

Unicode-tuntemuksellisten trimmausrutiinien tulisi käyttää Character::isWhitespace(int).

Lisäksi kehittäjät eivät ole pystyneet poistamaan nimenomaisesti sisäkkäistä valkoista välilyöntiä tai nimenomaisesti poistamaan valkoista välilyöntiä peräkkäin.

Ratkaisu

Tuodaan trimmausmenetelmiä, jotka ovat tietoisia Unicode-valkotilasta ja tarjoavat lisäsäätöä vain etumaisen tai vain peräkkäisen välilyönnin suhteen.

Yhteinen piirre näille uusille metodeille on se, että niissä käytetään erilaista (uudempaa) määritelmää ”valkotilalle” kuin vanhoissa metodeissa, kuten esimerkiksi String.trim(). Bug JDK-8200373.

Tämänhetkinen JavaDoc for String::trim ei tee selväksi, mitä ”välilyönnin” määritelmää koodissa käytetään. Koska lähitulevaisuudessa on tulossa lisää trimmausmenetelmiä, jotka käyttävät eri määritelmää välilyönnille, selvennys on välttämätöntä. String::trim käyttää välilyönnin määritelmänä mitä tahansa koodipistettä, joka on pienempi tai yhtä suuri kuin välilyöntimerkin koodipiste (\u0020.) Uudemmat trimmausmenetelmät käyttävät (valkoisen) välilyönnin määritelmänä mitä tahansa koodipistettä, joka palauttaa arvon true, kun se siirretään Character::isWhitespace-predikaatille.

Metodi isWhitespace(char) lisättiin Character-luokkaan JDK 1.1:n myötä, mutta metodi isWhitespace(int) otettiin käyttöön Character-luokassa vasta JDK 1.5:n myötä. Jälkimmäinen metodi (se, joka hyväksyy int-tyyppisen parametrin) lisättiin tukemaan lisämerkkejä. Character-luokan Javadoc-kommentit määrittelevät lisämerkit (jotka tyypillisesti mallinnetaan int-pohjaisella ”koodipisteellä”) verrattuna BMP-merkkeihin (jotka tyypillisesti mallinnetaan yksittäisellä merkillä):

Merkkien joukkoa U+0000:n ja U+FFFF:n väliltä kutsutaan joskus monikieliseksi perustasoksi (Basic Multilingual Plane, BMP). Merkkejä, joiden koodipisteet ovat suurempia kuin U+FFFF, kutsutaan lisämerkeiksi. Java-alusta käyttää UTF-16-esitystä merkkimäärissä ja String- ja StringBuffer-luokissa. Tässä esityksessä lisämerkit esitetään char-arvojen parina … Char-arvo edustaa siis Basic Multilingual Plane (BMP) -koodipisteitä, mukaan lukien UTF-16-koodauksen korvaavat koodipisteet eli koodiyksiköt. Int-arvo edustaa kaikkia Unicode-koodipisteitä, myös täydentäviä koodipisteitä. … Menetelmät, jotka hyväksyvät vain char-arvon, eivät voi tukea lisämerkkejä. … Metodit, jotka hyväksyvät int-arvon, tukevat kaikkia Unicode-merkkejä, myös lisämerkkejä.

OpenJDK Changeset.

Benchmark comparison between trim() and strip() – Why is String.strip() 5 times faster than String.trim() for blank string In Java 11

Vastaa

Sähköpostiosoitettasi ei julkaista.