Equivalente de Sprintf en Java


Answers

@erickson.

Las cadenas son tipos inmutables. No puede modificarlos, solo devuelve nuevas instancias de cadena.

Por eso, "foo" .format () tiene poco sentido, ya que tendría que llamarse así

string newString = "foo".format();

Los autores originales de Java (y los autores de .NET), decidieron que un método estático tenía más sentido en esta situación, ya que no está modificando "foo", sino que llama a un método de formato y pasa una cadena de entrada.

EDITAR : Heh, este sitio puede ser tan divertido a veces. Me criticaron por mencionar el hecho de que las cadenas son tipos inmutables.

Aquí hay un ejemplo de por qué Format () sería tonto como método de instancia. En .NET (y probablemente en Java), Replace () es un método de instancia.

Puedes hacerlo:

 "I Like Wine".Replace("Wine","Beer");

Sin embargo, no sucede nada, porque las cadenas son inmutables. Reemplazar intenta devolver una nueva cadena, pero está asignada a nada.

Esto causa muchos errores comunes de novato como:

// Contrived Example
inputText.Replace(" ","%20");

Nuevamente, no pasa nada, en cambio tienes que hacer:

inputText = inputText.Replace(" ","%20");

Ahora, si entiendes que las cadenas son inmutables, eso tiene perfecto sentido. Si no lo haces, entonces estás confundido. El lugar adecuado para Reemplazar, donde Format es, como un método estático de Cadena:

 inputText = String.Replace(inputText," ", "%20");

Ahora no hay dudas sobre qué está pasando.

La verdadera pregunta es, ¿por qué los autores de estos marcos deciden que uno debe ser un método de instancia y el otro estático? En mi opinión, ambos se expresan con mayor elegancia como métodos estáticos, pero Erickson parece pensar que ambos pertenecen como métodos de instancia.

Independientemente de tu opinión, la verdad es que eres menos propenso a cometer un error al usar la versión estática, y el código es más fácil de entender (No hay escondidas).

Por supuesto, hay algunos métodos que son perfectos como métodos de instancia, tome String.Length ()

int length = "123".Length();

En esta situación, es obvio que no estamos tratando de modificar "123", simplemente lo inspeccionamos y devolvemos su longitud ... Este es un candidato perfecto para un método de instancia.

Mis reglas simples para los métodos de instancia en objetos inmutables:

  • Si necesita devolver una nueva instancia del mismo tipo, use un método estático.
  • De lo contrario, use un método de instancia.
Question

Printf se agregó a Java con la versión 1.5, pero parece que no puedo encontrar cómo enviar la salida a una cadena en lugar de a un archivo (que es lo que hace sprintf en C). ¿Alguien sabe como hacer esto?




Related