Est-il possible de créer une chaîne Java à l’aide d’une fonction de formatage de style SLF4J?

J’ai entendu dire que l’utilisation de SsortingngBuilder est plus rapide que celle de la concaténation de chaînes, mais j’en ai marre de lutter tout le temps avec des objects SsortingngBuilder. J’ai récemment été exposé à la bibliothèque de journalisation SLF4J et j’adore la simplicité de sa mise en forme consistant à “faire ce qu’il faut” par rapport à Ssortingng.format. Existe-t-il une bibliothèque qui me permettrait d’écrire quelque chose comme:

int myInteger = 42; MyObject myObject = new MyObject(); // Overrides toSsortingng() Ssortingng result = CoolFormatingLibrary.format("Simple way to format {} and {}", myInteger, myObject); 

De plus, y a-t-il une raison (y compris les performances, mais excluant le contrôle fin de la date et le formatage des chiffres significatifs) pourquoi je pourrais vouloir utiliser Ssortingng.format sur une telle bibliothèque si elle existe?

Pour concaténer des chaînes une fois , l’ancien fiable "str" + param + "other str" convient parfaitement (il est en fait converti par le compilateur en un SsortingngBuilder ).

Les SsortingngBuilders sont principalement utiles si vous devez continuer à append des éléments à la chaîne, mais vous ne pouvez pas tous les regrouper en une seule déclaration. Par exemple, prenez une boucle for:

 Ssortingng str = ""; for (int i = 0; i < 1000000; i++) { str += i + " "; // ignoring the last-iteration problem } 

Cela fonctionnera beaucoup plus lentement que la version équivalente de SsortingngBuilder:

 SsortingngBuilder sb = new SsortingngBuilder(); // for extra speed, define the size for (int i = 0; i < 1000000; i++) { sb.append(i).append(" "); } String str = sb.toString(); 

Mais ces deux sont fonctionnellement équivalents:

 Ssortingng str = var1 + " " + var2; Ssortingng str2 = new SsortingngBuilder().append(var1).append(" ").append(var2).toSsortingng(); 

Cela dit, ma réponse est la suivante:

Découvrez java.text.MessageFormat . Exemple de code des Javadocs:

 int fileCount = 1273; Ssortingng diskName = "MyDisk"; Object[] testArgs = {new Long(fileCount), diskName}; MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s)."); System.out.println(form.format(testArgs)); 

Sortie:

The disk "MyDisk" contains 1,273 file(s).

Il existe également une méthode de format statique qui ne nécessite pas de créer un object MessageFormat .

Toutes ces bibliothèques se résumeront à la concaténation de chaînes au niveau le plus élémentaire, de sorte qu'il n'y aura pas beaucoup de différence de performances entre elles.

Bien que la réponse acceptée soit bonne, si (comme moi) on s’intéresse à la sémantique exacte du style Slf4J, la solution correcte consiste à utiliser le MessageFormatter de Slf4J.

Voici un exemple d’extrait d’utilisation:

 public static Ssortingng format(Ssortingng format, Object... params) { return MessageFormatter.arrayFormat(format, params).getMessage(); } 

(Notez que cet exemple rejette un dernier argument de type Throwable )

Vous pouvez déjà le faire en utilisant la classe Java Ssortingng intégrée .