{"id":202,"date":"2023-06-03T00:36:05","date_gmt":"2023-06-03T00:36:05","guid":{"rendered":"https:\/\/canessaalvamiguel.dev\/?p=202"},"modified":"2023-06-03T01:01:56","modified_gmt":"2023-06-03T01:01:56","slug":"companion-objects-in-scala","status":"publish","type":"post","link":"https:\/\/canessaalvamiguel.dev\/index.php\/2023\/06\/03\/companion-objects-in-scala\/","title":{"rendered":"Companion Objects in Scala"},"content":{"rendered":"\n<p>En Scala, adem\u00e1s de las clases, tenemos una caracter\u00edstica adicional llamada Companion Objects, que complementa y ampl\u00eda la funcionalidad de las clases. Los Companion Objects nos permiten asociar funciones y valores est\u00e1ticos a una clase, lo que proporciona un espacio para la l\u00f3gica compartida y facilita la creaci\u00f3n de constructores alternativos, m\u00e9todos de f\u00e1brica y m\u00e1s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Companion Objects: una visi\u00f3n general<\/h2>\n\n\n\n<p>En Scala, cada clase puede tener un Companion Object asociado. El Companion Object tiene el mismo nombre que la clase y se define en el mismo archivo fuente. Mientras que las instancias de una clase se crean utilizando el operador <code>new<\/code>, los Companion Objects se pueden acceder directamente, sin necesidad de instanciar la clase.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Caracter\u00edsticas clave de los Companion Objects:<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Funciones y valores est\u00e1ticos: <\/strong>Los Companion Objects pueden contener funciones y valores que se pueden acceder directamente sin crear una instancia de la clase. Estos elementos est\u00e1n asociados con la clase en s\u00ed y no con las instancias individuales de la clase.<\/li>\n\n\n\n<li><strong>Acceso a miembros privados:<\/strong> Los Companion Objects pueden acceder a los miembros privados de la clase y viceversa. Esto significa que podemos utilizar el Companion Object para implementar m\u00e9todos de utilidad o constructores alternativos que requieren acceso a los miembros privados de la clase.<\/li>\n\n\n\n<li><strong>Compartir estado y comportamiento:<\/strong> Los Companion Objects proporcionan un espacio para compartir estado y comportamiento entre todas las instancias de una clase. Esto es especialmente \u00fatil para implementar m\u00e9todos de f\u00e1brica, constructores alternativos y m\u00e9todos de clase que no dependen de una instancia particular.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Ejemplo de uso de Companion Objects:<\/h2>\n\n\n\n<p>Supongamos que tenemos una clase <code>Persona<\/code> y queremos proporcionar un constructor adicional para crear instancias a partir de un nombre completo en lugar de un nombre y un apellido separados. Podemos lograr esto utilizando un Companion Object. Veamos c\u00f3mo se ver\u00eda el c\u00f3digo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: scala; title: ; notranslate\" title=\"\">\nclass Persona(nombre: String, apellido: String) {\n  def nombreCompleto: String = s&quot;$nombre $apellido&quot;\n}\n\nobject Persona {\n  def apply(nombreCompleto: String): Persona = {\n    val nombres = nombreCompleto.split(&quot; &quot;)\n    new Persona(nombres(0), nombres(1))\n  }\n}\n\nval p1 = Persona.apply(&quot;Miguel Canessa&quot;)\nprintln(p1.nombreCompleto)\n\nval p2 = Persona(&quot;Miguel Canessa&quot;)\nprintln(p2.nombreCompleto)\n<\/pre><\/div>\n\n\n<p>En este ejemplo, hemos definido una clase <code>Persona<\/code> con un constructor que acepta un nombre y un apellido. Adem\u00e1s, hemos creado un Companion Object de la clase <code>Persona<\/code> que define un m\u00e9todo <code>apply<\/code>. Este m\u00e9todo toma un nombre completo, lo divide en nombre y apellido, y crea una nueva instancia de <code>Persona<\/code> utilizando el constructor existente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En Scala, adem\u00e1s de las clases, tenemos una caracter\u00edstica adicional llamada Companion Objects, que complementa y ampl\u00eda la<\/p>\n","protected":false},"author":1,"featured_media":62,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[39,8],"class_list":["post-202","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-scala","tag-companion-objects","tag-scala"],"_links":{"self":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/202","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/comments?post=202"}],"version-history":[{"count":2,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/202\/revisions"}],"predecessor-version":[{"id":204,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/posts\/202\/revisions\/204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media\/62"}],"wp:attachment":[{"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/media?parent=202"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/categories?post=202"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/canessaalvamiguel.dev\/index.php\/wp-json\/wp\/v2\/tags?post=202"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}