<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jordy Rodríguez</title>
    <description>The latest articles on Forem by Jordy Rodríguez (@jordy_4sd).</description>
    <link>https://forem.com/jordy_4sd</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3680647%2Fd22f2c9e-31dd-43fc-881f-29270cd4a104.jpg</url>
      <title>Forem: Jordy Rodríguez</title>
      <link>https://forem.com/jordy_4sd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jordy_4sd"/>
    <language>en</language>
    <item>
      <title>getFirst() y getLast(): Extrae elementos de listas en Java</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:23:17 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/getfirst-y-getlast-extrae-elementos-de-listas-en-java-2k39</link>
      <guid>https://forem.com/jordy_4sd/getfirst-y-getlast-extrae-elementos-de-listas-en-java-2k39</guid>
      <description>&lt;p&gt;Cuando necesitas sacar el primer o el último elemento de una colección, getFirst() y getLast() te ahorran busquedas de índices y dolores de cabeza.&lt;/p&gt;

&lt;p&gt;En mi día a día, trabajo con flujos de procesamiento donde las tareas llegan en orden y ciertas operaciones deben peekear extremos sin desordenarlos. En esas situaciones, tratar la estructura como un Deque (o usar LinkedList) y aprovechar getFirst/getLast te da claridad y menos errores que manipular índices manualmente.&lt;/p&gt;

&lt;p&gt;getFirst() y getLast() funcionan como la forma directa de mirar los extremos de una cola o lista tratada como Deque. Para LinkedList, estos métodos están disponibles precisamente para operar al inicio o al final sin complicaciones. Importante: no eliminan el elemento; si quieres quitar, tienes removeFirst/removeLast o sus variantes seguras.&lt;/p&gt;

&lt;p&gt;Cosas a tener en cuenta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si la estructura está vacía, getFirst() y getLast() lanzan NoSuchElementException.&lt;/li&gt;
&lt;li&gt;Si solo quieres mirar sin posibilidad de excepción, usa peekFirst()/peekLast().&lt;/li&gt;
&lt;li&gt;Si quieres extraer y eliminar al mismo tiempo, pollFirst()/pollLast() devuelve null cuando está vacía.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplo práctico (uso limpio en una lista que ya tiene elementos):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Deque&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.LinkedList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Deque&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Diseñar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Implementar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Probar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;primero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ultimo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otra opción útil si solo quieres mirar sin riesgo de excepción:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Deque&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.LinkedList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Deque&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Diseñar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Implementar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Probar"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;primeroPeek&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peekFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ultimoPeek&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tareas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;peekLast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acción concreta para hacer hoy mismo:&lt;br&gt;
Identifica en tu código una parte donde tomas el primer o último elemento de una Deque/LinkedList y refactorízala usando getFirst/getLast. Añade una comprobación de emptiness o, si solo quieres mirar sin costo, reemplázalo por peekFirst/peekLast. Pon a prueba con un caso vacío para ver que no explota y, si quieres, añade un pequeño test unitario que verifique ese comportamiento.&lt;/p&gt;



&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/BDzeOi6DREQ"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>El método repeat() en Java: Repite cadenas fácilmente</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:14:35 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/el-metodo-repeat-en-java-repite-cadenas-facilmente-3afk</link>
      <guid>https://forem.com/jordy_4sd/el-metodo-repeat-en-java-repite-cadenas-facilmente-3afk</guid>
      <description>&lt;p&gt;Detrás de muchos logs y informes hay una pequeña línea que marca la diferencia: repetir texto sin líos. Con repeat() en Java, decimos adiós a los bucles para construir strings repetidos.&lt;/p&gt;

&lt;p&gt;Esto importa en el día a día porque hago registros claros, separadores consistentes y columnas alineadas en informes automáticos. Una barra de separación bien definida o padding de columnas evita discusiones en los resultados y acelera la lectura de fallos.&lt;/p&gt;

&lt;p&gt;El método repeat(int count) existe desde Java 11. Es una función de String que devuelve la cadena original repetida count veces. Si count es 0, obtienes una cadena vacía; si es negativo, se lanza IllegalArgumentException. Es directo: cadena.repeat(n).&lt;/p&gt;

&lt;p&gt;Puede parecer trivial, pero es poderoso cuando necesitas consistencia sin complejidad. Úsalo para separar bloques de salida, construir encabezados de tablas o rellenar espacios para alineación. Ten en cuenta la memoria: repetir cadenas grandes muchas veces genera strings grandes; úsalo con tamaños razonables y evita usarlo en bucles de alto rendimiento sin medir.&lt;/p&gt;

&lt;p&gt;Ejemplos prácticos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Generar una línea de separación para logs&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"-"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sep&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Jordy"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;padded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repeat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"|"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padded&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como muestra, puedo ver claridad inmediata en la salida y menos tareas de formateo manual. Si te sirve, usa repeat para crear encabezados, barras de progreso simples o para rellenar columnas en CSVs generados automáticamente.&lt;/p&gt;

&lt;p&gt;Acción para hoy: identifica dos lugares en tu código donde concatentes manualmente para formatear salida y reemplázalos por repeat. Añade una barra separadora con '-'.repeat(40) y, si sales con columnas, usa padding con " ".repeat(...) para alinear. Verás la diferencia en legibilidad y mantenimiento.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/e2VZ0lXBZB4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>El nuevo instanceof en Java: Pattern Matching</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:13:18 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/el-nuevo-instanceof-en-java-pattern-matching-3i0o</link>
      <guid>https://forem.com/jordy_4sd/el-nuevo-instanceof-en-java-pattern-matching-3i0o</guid>
      <description>&lt;p&gt;El cast ya no manda en tu código. El nuevo instanceof con Pattern Matching llega para que leer, entender y mantener el flujo sea más rápido.&lt;/p&gt;

&lt;p&gt;En mi día a día lidio con APIs que devuelven Object, colecciones heterogéneas y eventos de distintas clases. Ver cada comprobación como un cast me rompe el ritmo; añade ruido, errores sutiles y pruebas repetitivas. Pattern Matching te da seguridad de tipo sin rebuscar en cada rama.&lt;/p&gt;

&lt;p&gt;Con instanceof pattern matching, puedes declarar la variable del tipo directamente en la condición, y esa variable queda disponible dentro del bloque sin un cast explícito. Esto reduce líneas y elimina errores de ClassCastException por descuido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obtenerDato&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Largo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No es una cadena"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si prefieres patters más declarativos, pattern matching para switch te permite escribir ramas por tipo sin duplicar lógica. Esto simplifica grandes estructuras de if/else.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"cadena: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"entero: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"otro"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoy mismo: toma un método que use varios instanceof o un conjunto de if/else con casts y refactorízalo con pattern matching. Ejecuta la suite de tests y compara legibilidad y cantidad de líneas. Si funciona, comparte el before/after con tu equipo para acelerar futuras revisiones.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/TiKVQE1G5ro"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Evita NullPointerException en Java</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:07:52 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/evita-nullpointerexception-en-java-1m42</link>
      <guid>https://forem.com/jordy_4sd/evita-nullpointerexception-en-java-1m42</guid>
      <description>&lt;p&gt;Cada fallo en producción grita NPE. Un null en la entrada, un segundo más y el cliente ya no está conectado.&lt;/p&gt;

&lt;p&gt;He visto esto demasiadas veces: estos nulls saltan cuando consumimos APIs, leemos datos de la base o manejamos configuración opcional. Un valor que llega null al otro lado del código estalla al dereferenciarlo, y el arreglo termina en hotfixes nocturnos.&lt;/p&gt;

&lt;p&gt;Primero, diseña por contrato: no devuelvas null. Si no hay valor, usa un valor por defecto o envoltura con Optional. Nosotros ganamos previsibilidad y reducimos costos de debugging. Por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ofNullable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;User:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"anonymous"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Además, aplica guardias tempranas para fail fast: valida entradas y evita que un null propague. Si un objeto es obligatorio, mantén su no-nullidad en todo el flujo. Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user is required"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cierra con una acción concreta para hoy: identifica una ruta crítica donde puedas recibir null y refactorízala para usar Optional o, al menos, devolver un valor por defecto. Elige una llamada a servicio o lectura de datos que pueda devolver null y ponle un default o envoltura con Optional, luego verifica con tests simples de null-safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  También tengo un video simple donde te muestra otra forma de evitar NPE:
&lt;/h2&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/Duh0OwmBciQ"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>softwaredevelopment</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Simplifica comparaciones númericas con la clase Math en Java</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:03:29 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/simplifica-comparaciones-numericas-con-la-clase-math-en-java-215b</link>
      <guid>https://forem.com/jordy_4sd/simplifica-comparaciones-numericas-con-la-clase-math-en-java-215b</guid>
      <description>&lt;p&gt;Un simple '==' entre doubles te traiciona. En la vida real, esas diferencias minúsculas pueden romper validaciones y decisiones de negocio.&lt;/p&gt;

&lt;p&gt;En mi día a día me enfrento a cálculos que deben cuadrar con límites tolerables: distancias, tolerancias de sensores, resultados numéricos de física. Si comparo con ==, me encuentro con falsos negativos o positivos por diferencias que ni se ven en la UI. Para ordenar números, comparar a mano con a - b también puede fallar por overflow o NaN. Por eso conviene separar dos ideas: igualdad con tolerancia y ordenación estable.&lt;/p&gt;

&lt;p&gt;La idea clave es simple: usa una tolerancia al comparar, y usa métodos de la clase Math para el orden. Para igualdad, calcula la diferencia y ajústala con una escala razonable; para ordenar, evita restas y usa Double.compare. Así reduces sorpresas en producción y haces que tu lógica sea determinista incluso con operaciones de precisión limitada.&lt;/p&gt;

&lt;p&gt;Ejemplo práctico (una utilidad mínima):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MathUtils&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;nearlyEqual&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Double&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usa la utilidad así: MathUtils.nearlyEqual(a, b, 1e-12). Si necesitas ordenar, usa MathUtils.compare(x, y) en lugar de restar.&lt;/p&gt;

&lt;p&gt;Acción para hoy: identifica dos lugares críticos de tu código donde comparas doubles y aplica una comparación tolerante con nearlyEqual, además de reemplazar restas por Double.compare para cualquier ordenación. Si te sirve, empieza con un epsilon relativo de 1e-12 y ajústalo a tus rangos de negocio.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/CWhI-g08XKs"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>El método isBlank() en Java: ¿En qué se diferencia de isEmpty()?</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 17:00:08 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/el-metodo-isblank-en-java-en-que-se-diferencia-de-isempty-2ggi</link>
      <guid>https://forem.com/jordy_4sd/el-metodo-isblank-en-java-en-que-se-diferencia-de-isempty-2ggi</guid>
      <description>&lt;p&gt;IsBlank es tu arma secreta contra entradas que parecen vacías, pero no lo están. IsEmpty solo mira la longitud y se rompe con espacios, saltos o tabs.&lt;/p&gt;

&lt;p&gt;En mi día a día, recibo payloads de clientes donde un campo llega como "" o como "   " o con saltos de línea. Si me limito a isEmpty, esos casos pasan la validación y luego el backend falla al procesar datos invisibles. Con isBlank, una cadena que solo tiene whitespace ya no pasa como válida.&lt;/p&gt;

&lt;p&gt;isBlank() verifica algo más profundo que la longitud: considera como vacío cualquier String que sea "" o que contenga únicamente caracteres de whitespace. isEmpty() solo devuelve true si la longitud es 0. Esto cambia la forma en que validamos inputs, logs y mensajes de error. Si quieres una validación de usuario robusta, usa isBlank para decidir “esto realmente está vacío” y reserva isEmpty para casos donde la ausencia de texto que no admite espacios sea lo que buscas.&lt;/p&gt;

&lt;p&gt;La diferencia se nota sobre todo cuando hay datos que no ves a simple vista. Cualquier dato que no contribuya a la información real debe marcarse como inválido. Si en tu flujo te encuentras con nulos, recuerda que neither isBlank ni isEmpty protegen contra NPE por sí solos; añade un chequeo de null o usa una utilidad para normalizar antes de validar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"   "&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"foo"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hoy mismo: revisa una validación de input en tu proyecto y cambia isEmpty por isBlank cuando quieras considerar whitespace como vacío. Añade un chequeo de null (por ejemplo, si el flujo puede recibir null) o crea una pequeña utilidad: boolean isBlankOrNull(String s) { return s == null || s.isBlank(); }. Implementa esa comprobación en al menos dos puntos del flujo de entrada y ejecuta tus pruebas para ver el ahorro en errores de usuario.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/ercmnzmFLQc"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Funciones con parámetros infinitos en Java</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 16:57:59 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/funciones-con-parametros-infinitos-en-java-22h3</link>
      <guid>https://forem.com/jordy_4sd/funciones-con-parametros-infinitos-en-java-22h3</guid>
      <description>&lt;p&gt;¿Qué pasaría si una función pudiera aceptar 2, 5 o 20 argumentos sin cambiar su firma? Eso existe en Java: varargs, la forma elegante de manejar “parámetros infinitos”.&lt;/p&gt;

&lt;p&gt;En mi día a día, los varargs me ahorran escribir métodos para cada aridad y me permiten construir APIs más fluidas. Piensa en un logger que acepte un formato y cualquier cantidad de argumentos, o en una utilidad que arme un mensaje a partir de tokens variables. Con varargs, lo complejo se queda en una firma simple y clara.&lt;/p&gt;

&lt;p&gt;El truco está en que Java transforma ese parámetro variado en un arreglo del tipo correspondiente. Eso significa que, cada vez que llamas a un método con valores extra, se crea un array en tiempo de ejecución. Es rápido para casos simples, pero ojo: si el camino es crítico en rendimiento, evita usar varargs en hot paths o haz overloading para los casos más comunes. También limita la mezcla con tipos genéricos para evitar boxing innecesario.&lt;/p&gt;

&lt;p&gt;Ejemplo práctico en código claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Utils {
  public static int sum(int... numbers) { int s = 0; for (int n : numbers) s += n; return s; }
  public static String join(String delimiter, String... tokens) { return String.join(delimiter, tokens); }
  public static void main(String[] args) {
    System.out.println(sum(1, 2, 3, 4));
    System.out.println(join(" - ", "A", "B", "C"));
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo ves: una misma firma para cualquier cantidad de entradas, utilizable en múltiples contextos sin boilerplate.&lt;/p&gt;

&lt;p&gt;Hoy te propongo un paso concreto: identifica un método que tengas ya con dos o tres variantes de aridad (o que reciba un formato y argumentos). Reescribe esa firma para usar varargs y refactoriza dos o tres llamadas para ver la ganancia de claridad. Mide el cambio de legibilidad y, si hace daño en rendimiento, añade overloading para los casos más comunes.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/a6rJ6O0FNZA"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>++ antes y ++ después en Java: Operador de incremento</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 16:50:18 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/-antes-y-despues-en-java-operador-de-incremento-19h7</link>
      <guid>https://forem.com/jordy_4sd/-antes-y-despues-en-java-operador-de-incremento-19h7</guid>
      <description>&lt;p&gt;El ++ no es solo para sumar. En Java, pre y post increment pueden cambiar lo que tu código devuelve, no solo lo que guarda. Te lo digo con ejemplos reales que me pasaron en producción.&lt;/p&gt;

&lt;p&gt;En mi día a día, el problema aparece cuando el incremento ocurre dentro de una expresión o al pasar el valor a un índice o a un método. A simple vista parece trivial, pero puede romper la lógica de un bucle o una llamada si confundes el momento en que se incrementa y se usa el valor.&lt;/p&gt;

&lt;p&gt;El pre-incremento (++x) incrementa y devuelve el valor nuevo; el post-incremento (x++) devuelve el valor actual y luego lo incrementa. En bucles o en llamadas, elegir uno cambia el comportamiento. Si necesitas el valor ya incrementado para la operación siguiente, usa ++x; si necesitas el valor tal como está antes de incrementar, usa x++.&lt;/p&gt;

&lt;p&gt;Ejemplo claro en código sencillo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IncrementDemo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// a=2, b=2&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt; &lt;span class="c1"&gt;// c=2, d=1&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" | "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este tipo de diferencias se ve a menudo cuando el incremento está ligado a una operación de índice o a la entrega de un valor a un método. Un mal uso puede hacer que la condición de un bucle se cumpla una iteración más o que un elemento se procese con el índice equivocado.&lt;/p&gt;

&lt;p&gt;Acción para hoy mismo: revisa dos lugares en tu base de código donde utilices x++ para obtener el valor que se pasa a una próxima operación o a un índice. Cambia esos casos a ++x cuando el valor incrementado debe usarse inmediatamente, y agrega una pequeña prueba que compare el comportamiento con ambas variantes. Si no hay pruebas, escribe una de unidad que verifique explícitamente la diferencia entre pre y post en un escenario de contador o índice. Con eso ya ganas claridad y reduces bugs silenciosos.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/rQL1dDXmFWo"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Separa números largo en Java con guiones bajos</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 16:48:54 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/separa-numeros-largo-en-java-con-guiones-bajos-5aip</link>
      <guid>https://forem.com/jordy_4sd/separa-numeros-largo-en-java-con-guiones-bajos-5aip</guid>
      <description>&lt;p&gt;¿Cuántas veces te pierden los dígitos de un número gigante al mirar el código? En Java, escribe literales con guiones bajos y verás la diferencia al instante.&lt;/p&gt;

&lt;p&gt;Yo lo aplico a diario: constantes financieras, contadores de pruebas y límites del sistema. No cambia la lógica, pero sí la legibilidad en la revisión de código.&lt;/p&gt;

&lt;p&gt;Desde Java 7 puedes usar guiones bajos entre dígitos de literales enteros o long. No se pueden colocar al inicio o al final, junto al punto decimal, ni justo antes de la notación de tipo (L, F, D). En números hex o binarios también funcionan, pero me mantengo en decimal para evitar sorpresas. Mantener consistencia en todo el proyecto ayuda a que el equipo comprenda rápidamente la intención del número.&lt;/p&gt;

&lt;p&gt;Mi regla práctica es simple: agrupa en bloques de tres dígitos para golpes visuales de millares, millones, etc. Usa L al final para long y evita usar guiones bajos en valores que ya tienen un significado especial (IDs generados, cadenas numéricas, etc.). Si alguien copia el literal, no debe haber ambigüedad.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReadableLongs&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9_223_372_036_854_775_807L&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;yearlyRevenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1_234_567_890_123_456L&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yearlyRevenue&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acción para hoy mismo: identifica tres literales largos en tu código y refactorízalos para usar guiones bajos. Luego haz compile y corre tus tests para confirmar que todo sigue funcionando igual. Si puedes, hazlo en un PR pequeño y revisa con tu equipo para acordar la convención de formato.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/8MohgNMdJiw"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Final vs inmutable en Java: No son lo mismo</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 04:30:14 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/final-vs-inmutable-en-java-no-son-lo-mismo-20kg</link>
      <guid>https://forem.com/jordy_4sd/final-vs-inmutable-en-java-no-son-lo-mismo-20kg</guid>
      <description>&lt;p&gt;Final no es inmutable. En Java, una referencia puede ser final y el objeto al que apunta seguir cambiando.&lt;/p&gt;

&lt;p&gt;En mi día a día, veo APIs que devuelven listas mutables o exponen setters que permiten modificar el estado después de crear el objeto. Eso genera efectos colaterales difíciles de rastrear y pruebas más complicadas. Si queremos garantizar consistencia, necesitamos distinguir bien cuándo hablamos de la referencia y cuándo hablamos del estado del objeto.&lt;/p&gt;

&lt;p&gt;El concepto en dos ideas rápidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final: bloquea la re-asignación de la referencia, no el contenido. Puedes hacer esto y, aun así, manipular el objeto si es mutable.&lt;/li&gt;
&lt;li&gt;Inmutable: el objeto no cambia después de su construcción. No expone mutadores y, si tiene colecciones, no las permite modificar desde fuera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ejemplos claros ayudan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final aplicado a una colección mutable
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"alpha"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// OK&lt;/span&gt;
&lt;span class="c1"&gt;// items = new ArrayList&amp;lt;&amp;gt;(); // Error: cannot assign a value to final variable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Clase inmutable real
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserId&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UserId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;value&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una clase así no expone mutadores y su estado queda fijado al construirla.&lt;/p&gt;

&lt;p&gt;Para lograr inmutabilidad real, cuida estos puntos: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;campos privados y finales;&lt;/li&gt;
&lt;li&gt;no permitas setters;&lt;/li&gt;
&lt;li&gt;si expones datos mutables, devuelve copias defensivas o colecciones inmutables (por ejemplo, List.copyOf en Java 10+).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hoy mismo: revisa una API que devuelve una List mutable. Ajusta para devolver una colección inmutable o una copia y añade una prueba que verifique que la lista no puede ser alterada por el consumidor. Si haces ese ajuste, ya ganamos claridad, seguridad y menos sorpresas en producción.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/85p6rqlrRkY"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cadenas de texto en Java: TextBlocks</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 04:21:58 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/cadenas-de-texto-en-java-textblocks-1p8g</link>
      <guid>https://forem.com/jordy_4sd/cadenas-de-texto-en-java-textblocks-1p8g</guid>
      <description>&lt;p&gt;Las cadenas largas en Java ya no se pelean con escapes. Con Text Blocks puedes escribir SQL, JSON o HTML tal como lo ves, sin convertir cada salto de línea en \n.&lt;/p&gt;

&lt;p&gt;En el día a día de desarrollo, lidiamos con consultas acumuladas, fragmentos HTML embebidos y mensajes de error en formato JSON. Traducir todo eso a strings con escapes es una fuente constante de errores y mala legibilidad. Los Text Blocks cambian el juego: el código se ve como el contenido que representa.&lt;/p&gt;

&lt;p&gt;Los Text Blocks son literales de texto entre tres comillas dobles. El contenido conserva saltos de línea y sangrías, y la indentación se normaliza para que puedas alinear el bloque con tu código sin romper el string. Puedes mezclar comillas simples y dobles sin problemas; no necesitas escapar comillas internas.&lt;/p&gt;

&lt;p&gt;Cómo se usan en la práctica: crea un bloque como si pegaras el texto en un editor. Eso sí, evita dejar espacios al inicio que no quieras en el resultado final; si necesitas ajustar, puedes usar stripIndent() en la cadena resultante.&lt;/p&gt;

&lt;p&gt;Código de ejemplo (SQL):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"""
    SELECT id, name, email
    FROM customers
    WHERE status = ?
    AND created_at &amp;gt;= ?
    """&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con este enfoque, las pruebas o los fixtures de JSON o HTML también quedan limpios en el día a día de los proyectos. Yo lo uso para declaraciones SQL dinámicas en repos y para generar respuestas de prueba en los servicios que montamos en 4SoftwareDevelopers. Menos escapes, menos ruido, menos caídas por errores de comillas.&lt;/p&gt;

&lt;p&gt;Acción para hacer hoy: toma una cadena multi-línea que tengas en tu proyecto (una consulta, una plantilla JSON o HTML) y conviértela a un Text Block. Compila y ejecuta una prueba para verificar que el contenido se mantiene exactamente igual. Si ves sangrías extra, prueba con stripIndent().&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/wB5nwYq5_PQ"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>¿Qué es el Autoboxing y unboxing en Java?</title>
      <dc:creator>Jordy Rodríguez</dc:creator>
      <pubDate>Sat, 27 Dec 2025 04:20:38 +0000</pubDate>
      <link>https://forem.com/jordy_4sd/que-es-el-autoboxing-y-unboxing-en-java-1ed1</link>
      <guid>https://forem.com/jordy_4sd/que-es-el-autoboxing-y-unboxing-en-java-1ed1</guid>
      <description>&lt;p&gt;Autoboxing y unboxing en Java no son trucos mágicos; son el puente entre primitivos y objetos que usas cada día. Si ves List en tu código, ya estás en su territorio.&lt;/p&gt;

&lt;p&gt;En el día a día importan porque te evitan escribir conversiones, pero cada conversión genera objetos y, en bucles apretados, eso suma. Entender cuándo sucede la conversión te ayuda a evitar hot spots de rendimiento y errores sutiles.&lt;/p&gt;

&lt;p&gt;El concepto en corto: el autoboxing es la conversión automática de un primitivo a su wrapper (int -&amp;gt; Integer, real -&amp;gt; Double, etc.). El unboxing es al revés, cuando una clase envoltorio se usa como primitivo en operaciones aritméticas o comparaciones. Java también usa caché para wrappers de rango pequeño (-128 a 127), lo que evita crear nuevas instancias en muchos casos. Pero ojo: convertir null a un primitivo provoca NullPointerException, y el boxing/unboxing frecuente puede generar overhead de memoria y GC si lo haces en loops críticos.&lt;/p&gt;

&lt;p&gt;Ejemplo práctico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// autoboxing: int -&amp;gt; Integer&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// unboxing: Integer -&amp;gt; int&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este patrón es común: trabajas con colecciones de wrappers porque la API lo exige, pero luego haces cálculos con primitivos. El rendimiento mejora si evitas boxing innecesario en cuellos de botella y prefieres APIs que operan sobre primitivos cuando es posible.&lt;/p&gt;

&lt;p&gt;Un vistazo rápido a riesgos reales: un Integer puede ser null; al despojarlo de su envoltorio en una operación, obtienes NPE. Y en bucles muy calientes, cada autoboxing implica asignaciones y posible recolección, lo que puede traer pausas inesperadas.&lt;/p&gt;

&lt;p&gt;Hazlo hoy mismo&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revisa un método que recorra una List y haga sumas o cálculos. ¿Podrías usar un IntStream para evitar boxing innecesario? Por ejemplo, en lugar de sum += item, usa nums.stream().mapToInt(Integer::intValue).sum() y evita la conversión repetida.&lt;/li&gt;
&lt;li&gt;Si trabajas con valores que pueden ser null, añade un filtro de nulls o usa un Optional para evitar NPEs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con un par de cambios pequeños, verás menos basura de objetos y choques de rendimiento sin perder la legibilidad ni la seguridad de tipos.&lt;/p&gt;




&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/skwYkyUdKwY"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  📬 Conecta Conmigo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://ebook.4softwaredevelopers.com/" rel="noopener noreferrer"&gt;📘 Descarga gratis mi libro 'Java: el cambio es la única constante'&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers" rel="noopener noreferrer"&gt;🎥 Suscríbete a mi canal para más contenido así&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtube.com/@4SoftwareDevelopers/join" rel="noopener noreferrer"&gt;☕ Apoya mi contenido gratuito desde $1.00/mes&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/servicios.html" rel="noopener noreferrer"&gt;💼 ¿Necesitas ayuda con tu arquitectura? Consultoría 1-on-1&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://4softwaredevelopers.com/referidos.html" rel="noopener noreferrer"&gt;👀 Compra el software que uso y recomiendo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
