Pourquoi le format de la Chaîne(Objet... args) définie comme une méthode statique?
Je me demande pourquoi Java 5 et au-dessus de fournir un printf de style de formatage à l'aide d'une méthode statique de la classe String comme ceci:
public static String format(String format, Object... args)
au lieu de
public String format(Object... args)
afin que nous puissions écrire "%02d".format(5)
pour obtenir 05
au lieu de String.format("%02d", 5)
.
J'ai imaginé si je pouvais modifier la classe String, je pourrais ajouter ceci:
public String format(Object... args) {
return format(this, args)
}
pour obtenir le même résultat.
J'ai trouvé qu'en C#, une méthode statique est également utilisé à la place d'une méthode d'instance.
Je me demande pourquoi ils ont décidé de faire cela, mais je ne suis pas venu pour une explication. Les méthodes d'instance trim
et substring
retourne une nouvelle instance de string, donc ils devraient avoir fait la même chose avec format
.
En outre, la DateFormat
classe utilise également ce:
public final String format(Date date)
pour le formatage des dates. Donc, si nous considérons l'exemple de DateFormat que le formateur, une instance de la Chaîne peut également être utilisé en tant que formateur.
Des idées?
- est-il vraiment important?
- il n'a pas vraiment d'importance, mais je me demandais simplement si il n'y a aucune logique derrière cela. Puisque nous ne sommes pas écrire
String.substring("abcde", 3, 2)
mais"abcde".substring(3, 2)
, le format doit avoir la même invocation de la méthode de trop, je pense. - De même, pourquoi est-il
Collections.sort(List)
, plutôt que deList.sort()
. Je n'ai jamais aimé que beaucoup. - J'ai créé un rapport de bug pour cette fois. Il a été refusé, mais il contient une explication. Je vais jeter un oeil. Je pense que le point principal était qu'une mise en forme syring est sémantiquement différent d'un autre syring essentiellement.
- Ce mineur de l'ineptie qui me motive les noix sur une base quotidienne.
- En Python (docs.python.org/2/library/stdtypes.html#str.format) et Ruby (ruby-doc.org/core-2.5.0/String.html#method-i-25) c'est non méthode statique
Vous devez vous connecter pour publier un commentaire.
Peut-être
"%02d".format(5)
semble impliquer que l'objet sur lequel laformat
méthode est appelée, est une chaîne de format.Dans ce cas, la chaîne de format se trouve également être un
String
, donc approfondir ce point, on pourrait dire que tous lesString
s sont des chaînes de format.Probablement cela peut être évité en disant qu'une méthode statique dans le
String
classe peut être utilisé pour formater une chaîne de caractères, plutôt que de faire un peu déclaration implicite sur tous lesString
s en général.Alors que je ne suis pas un concepteur de Java, je peux vous dire une raison claire pour rendre statique.
Java 5 est sorti avec beaucoup de fonctionnalités, mais deux de la note étaient:
Alors qu'il serait agréable d'être en mesure de dire
"bla: %d".format("foo"),
en faisant la méthode statique, vous pouvez utiliser le format d'une manière qui est très bien et propre-à la recherche de programmeurs C utilisé pourprintf()
.Et c'est pourquoi! En utilisant statique des importations, des printfs regardent presque exactement comme ils le font dans C. Génial!
La principale raison en est probablement que les concepteurs de Java ne voulait pas ajouter trop de choses à l'interface de la Chaîne. En faire une fonction membre aurait fallu le mettre sur la chaîne. Rappelez-vous qu'un non-statique méthode devait être sur l'objet de type String.
Une deuxième raison est que la statique format maintient sa ressemblance à C printf,
qui ressemble printf(FORMAT, ARG1, ARG2...)
Une autre raison est que le format est surchargé: il existe une version qui prend en paramètres régionaux en tant que premier paramètre (avant que la chaîne), donc faire sur l'objet de type string serait délicat.
String.format
de toute façon. "il y a une version qui prend en paramètres régionaux en tant que premier paramètre" - ce qui pourrait être fait en ayant un nom différent, par exempleString.localeFormat(...)
."%02d".format(5) ressemblerait à "%02d" est formaté à l'aide du format de 5 plutôt que le contraire. Aussi la plupart des chaînes ne sont pas adaptés comme format ("bonjour le monde".format(5)?), donc, la méthode doit lancer des exceptions pour la plupart des objets string.
"%02d and %02d".format(5, 15);
?Réponse repose dans la responsabilité de la méthode de mise en forme.
Il est plus logique et intuitive, au moins pour moi, de dire que la "chaîne de format est le Format de la méthode" que de dire que "Format fonctionne sur la chaîne de format". C'est donc, comme nous l' "habituellement" pass chaîne de format, connue au moment de la conception, de Format. En revanche, pour la Garniture, nous "habituellement" pass variable chaîne de caractères dont la valeur n'est pas connue au moment de la conception.
Ainsi, faire format méthode statique, le code de lecture plus intuitive. Regardez la suite (C#).
EDIT: Même si j'ai utilisé le C# exemple de code, il s'applique bien à Java. J'ai obtenu-cinq voix pour l'utilisation de la syntaxe C#!
Je pense vraiment que
format
doit être une méthode d'instance de la Chaîne, et donc aussi faireAppel strfmt.format(objets) au lieu de String.format(strfmt, objets)
d'un appel à une assistance statique.
chaîne de format et de frapper . vous obtenez le
format() comme une option dans un IDE.
strfmt.format(texte, objets) qui
ne serait pas ce qu'il semble faire.
Éventuellement montrer qu'il est un "utilitaire" de la fonction qui existe pour des raisons de commodité, mais qui n'est pas vraiment une fonction intrinsèque d'une Chaîne. Qui est, la Chaîne
"%02d"
est une façon de représenter un format, mais il ne fait aucun formatage.La méthode existe pour faciliter le formatage de Chaînes de caractères, mais Formateur (qui effectue la mise en forme réelle) peut également mettre les autres types d'objets (Date, etc).
Simplement parce que l'appel rappelle C est
sprintf
fonction.Probablement parce que la Chaîne est immuable et, par conséquent, cette méthode a pour créer et renvoyer une nouvelle instance de l'instance de Chaîne. Si la méthode n'a pas été déclarée statique, vous auriez probablement s'attendre à modifier la Chaîne de l'instance sur laquelle il a été appelé.
Je pense qu'il n'est pas obligatoire que Java faire toute construction similaire à quoi que ce soit d'autre, même en C++. Rien a adopté doit en être ainsi parce que les développeurs de l'accepter. En outre, des arguments comme "ils l'ont fait semblable à quelque chose d'autre" n'expliquent pas pourquoi ils ne vous contentez pas d'une méthode d'instance de la version, ils le font avec des primitives wrappers (en plus de l'instance méthode toString (), ils ont la version statique).
C'est ce que je pense:
Sur un cas normal, les deux formes sont équivalentes, mais supposons que nous ayons quelque chose comme:
et ensuite, nous appelons:
le devenir invalide l'argument de Java et de clarifier ce en jetant une instance de IllegalArgumentException (même dans le cas de Formatage, il y a beaucoup de sortes).
Cependant, quelque chose comme:
l'invalide n'est plus l'argument. Le problème réside maintenant à l'instance, il est appelé et est donc probaby mieux décrit comme un "état non valide" (pas de Java "IllegalStateException", qui a une toute autre utilisation). Mais parce que les Chaînes sont immuables, ce soi-disant "état" ne changera jamais, il restera toujours invalide en tant que format, même s'il est valide d'un simple string.
De le comparer avec, par exemple, java.lang.Long. Les deux versions de toString ne sera jamais jeter d'exception, de sorte qu'ils sont à la fois l'équivalent.
java.util.IllegalFormatException
de ne pas prolongerjava.lang.IllegalArgumentException
, mais plutôt être son propre, indépendante de la classe? Je pense qu'il serait judicieux de dire une chaîne de caractères de format de lui-même par l'insertion d'objets, mais alors il renvoie une erreur que la chaîne n'a pas un format valide.Juste une mauvaise conception. Un pythoner il est douloureux.
En C#, les chaînes sont immuables. Je pense que c'est vrai en Java aussi (pas sûr à 100% sur que). Donc, vous n'êtes pas changer la chaîne par l'appel d'une méthode de mise en forme, vous renvoyez une nouvelle chaîne avec la mise en forme. Ce qui en fait une classe de niveau de la méthode et non une instance au niveau de la méthode, il est donc statique. Vous pouvez ajouter une instance au niveau de la façade en C# à l'aide d'une fonction d'extension, mais qui est tout simplement de sucre syntaxique sur le haut d'une fonction statique.