Perché Java String non ha metodi di manipolazione delle stringhe statiche?

17

Perché i designer Java non hanno creato versioni statiche dei metodi di manipolazione delle stringhe nella classe java.lang.String ? I seguenti metodi sono quelli a cui mi riferisco, ma la domanda può essere estesa anche ad altri metodi non statici nella classe.

concat(String)                        substring(int, int)
replace(char, char)                   toLowerCase()
replace(CharSequence, CharSequence)   toLowerCase(Locale)
replaceAll(String, String)            toString()
replaceFirst(String, String)          toUpperCase()
split(String)                         toUpperCase(Locale)
split(String, int)                    trim()
substring(int)

Avere solo versioni non statiche di questi metodi obbliga esplicito a null-checking ovunque debba essere chiamato un tale metodo. Ad esempio, semplicemente chiamando example = example.trim() verrebbe a NullPointerException se String example = null . Quindi il programmatore deve eseguire il seguente controllo nullo della caldaia:

if (example != null)
    example = example.trim();
// OR:
example = (example==null) ? null : example.trim();
example = (example==null) ? null : example.substring(5);

Immaginerei che sarebbe stato molto più comodo se String avesse versioni statiche di questi metodi (forse anche esclusivamente ), che avrebbero preso la stringa di input come primo argomento:

example = String.trim(example);
example = String.replace(example, 'a', 'b');
example = String.substring(example, 5);

Ciò avrebbe portato a un codice più pulito scritto da programmatori che si sarebbero occupati automaticamente dei casi null semplicemente restituendo null, piuttosto che forzare i programmatori a gestire in modo esplicito casi nulli. Il ritorno di null ha senso per me dal momento che la manipolazione di una stringa null dovrebbe risultare in una stringa null , non un errore.

Perché i designer Java non hanno pensato a questo quando hanno progettato la classe String in Java 1 o Java 2, o addirittura aggiunto tale funzionalità in una versione successiva di Java?

    
posta ADTC 12.12.2013 - 07:02
fonte

4 risposte

30

The returning of null makes sense to me since manipulating a null string should result in a null string, not an error

Bene, questa è la tua opinione. Altri potrebbero argomentare che le operazioni String su un oggetto nullo, che non contiene una stringa, non hanno senso e quindi dovrebbero generare un'eccezione

Perché "i progettisti Java" hanno fatto o no qualcosa è difficile da risolvere.

Ci sono già delle librerie là fuori che possono eseguire operazioni String a prova di null, ad es. StringUtils di Apache Commons. Puoi usare quella o librerie simili se ne hai bisogno.

Aggiunta basata sui tuoi commenti

Leggendo i commenti, sembra che il vero problema che devi affrontare è che devi controllare null su tutto il tuo codice. Questo può essere un indicatore di una cattiva progettazione del programma senza contratti chiaramente definiti tra le interfacce. Potresti voler leggere Evitare le istruzioni "! = Null" in Java?

    
risposta data 12.12.2013 - 07:41
fonte
10

IMO l'intero approccio "if arg is null return null" ai metodi di scrittura aumenta inutilmente la complessità ciclomatica del tuo programma.

Le librerie Java iniziali utilizzavano l'approccio di ritorno null, ma i tipi JDK erano sempre protetti da zero con eccezioni.

Con il tempo, penso che l'ultimo approccio sia venuto fuori come il chiaro vincitore.

Perché? Poiché i campi null infrangono molti principi di oo. Semplicemente non puoi trattarli come membri di una classe polimorfa. Ciò significa che devi sempre codificare i casi speciali per null, e quindi la tua complessità ciclomatica aumenta quando devi presupporre che le cose possano essere nulle.

Per risolvere i tuoi problemi, considera l'utilizzo del modello di oggetto nullo invece di fare affidamento su campi nulli.

    
risposta data 12.12.2013 - 08:56
fonte
3

Non dire questo è il motivo, ma ad eccezione di toString, tutti questi metodi sono facilmente incapsulati in una classe helper statica, mentre il contrario non è vero.

vale a dire. se vuoi Stings.toUpper (stringa di input) il codice per questo è facile da scrivere, ma se vuoi instance.toUpper e tutto ciò che hai è String.toUpper, beh, è impossibile ... a meno che non introducano metodi di estensione, che molto probabilmente non è stato nemmeno preso in considerazione al momento.

    
risposta data 12.12.2013 - 08:08
fonte
-2

In java, quella stringa è un oggetto. Questa è una scelta di design.

I riferimenti agli oggetti possono essere nulli e sono nulli se non vi è assegnato alcun oggetto. Se chiami un tale oggetto, viene lanciata una NullPointerException. È un comportamento oo-comportamentale standard.

I progettisti Java hanno fatto la scelta di avere le stringhe come oggetto e avere quei metodi che lanciano le eccezioni del puntatore nullo è ciò che si ottiene se si desidera che le stringhe siano oggetti.

Why didn't Java designers think of this when they designed the String class in Java 1 or Java 2, or even add such a functionality in a later Java version?

Probabilmente ci hanno pensato e hanno scelto di incorporare oo-behavior.

    
risposta data 12.12.2013 - 09:14
fonte

Leggi altre domande sui tag