{"id":1136,"date":"2024-09-24T12:06:00","date_gmt":"2024-09-24T10:06:00","guid":{"rendered":"https:\/\/www.pinguytaz.net\/?p=1136"},"modified":"2024-09-10T02:09:41","modified_gmt":"2024-09-10T00:09:41","slug":"crear-extensiones-para-appinventor-crear-un-enum-4","status":"publish","type":"post","link":"https:\/\/www.pinguytaz.net\/index.php\/2024\/09\/24\/crear-extensiones-para-appinventor-crear-un-enum-4\/","title":{"rendered":"Crear extensiones para AppInventor (Crear un enum) 4"},"content":{"rendered":"\n<p>Podemos hacer que nuestros par\u00e1metros de funci\u00f3n tengan un tipo personalizado de enum (as\u00ed podremos ver una descripci\u00f3n de lo que pasamos y a la funci\u00f3n le llega un entero que sera m\u00e1s sencillo de tratar que un String y el texto descriptivo del enum ser\u00e1 mas sencillo de modificar.<\/p>\n\n\n\n<p>Para este ejemplo tendremos dos ficheros:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/pinguytaz\/extAppInventor\/blob\/main\/Ejemplos\/src\/losejemplos\/helpers\/TipoEnum.java\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/pinguytaz\/extAppInventor\/blob\/main\/Ejemplos\/src\/losejemplos\/helpers\/TipoEnum.java<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/pinguytaz\/extAppInventor\/tree\/main\/Ejemplos\/src\/losejemplos\/Enumerado.java\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/pinguytaz\/extAppInventor\/tree\/main\/Ejemplos\/src\/losejemplos\/Enumerado.java<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"456\" height=\"93\" src=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5.png\" alt=\"\" class=\"wp-image-1139\" srcset=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5.png 456w, https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5-300x61.png 300w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><\/figure>\n\n\n\n<p>Para tener un men\u00fa desplegable de un enumerado lo realizaremos creando una clase <strong>TipoEnum<\/strong> que tendr\u00e1 la definici\u00f3n, este fichero se generara en un directorio inferior llamado \u00abhelpers\u00bb que es donde tendremos todas nuestras clases auxiliares. Por este motivo nuestro ejemplo comenzara indicando que es un paquete de helpers<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package losejemplos.helpers;<\/code><\/pre>\n\n\n\n<p>Esta enumeraci\u00f3n especial sera una implementaci\u00f3n de la interfaz \u00ab<strong>OptionList&lt;T&gt;<\/strong>\u00ab, en nuestro caso el tipo \u00abT\u00bb sera Integer ya que retorna valores enteros\u00bb<strong>OptionList&lt;Integer&gt;\u00bb<\/strong> y ademas de la definici\u00f3n de los valores tendremos los metodos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>toUnderlyingValue()<\/strong>  Que retorna el valor de tipo \u00abT\u00bb.<\/li>\n\n\n\n<li><strong>fromUnderlyingValue(T)<\/strong> que recoge el valor de tipo \u00abT\u00bb y lo convierte a una instancia de la enumeraci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p>Quedando un c\u00f3digo de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public enum TiposEnum implements OptionList&lt;Integer&gt; {\n  UnValor(0),\n  ElUno(1),\n  UnDo(2),\n  Varios(3);\n\n  private int tipoEnum;     \n  TiposEnum(int tipoEnum) {\n    this.tipoEnum = tipoEnum;\n  }\n  public Integer toUnderlyingValue() {        \n    return tipoEnum;\n  }\n  private static final Map&lt;Integer, TiposEnum&gt; lookup = new HashMap&lt;&gt;();\n  static {\n    for(TiposLog tipoEnum : TiposEnum.values()) {\n      lookup.put(tipoEnum.toUnderlyingValue(), tipoEnum);\n    }\n  }\n  public static TiposEnum fromUnderlyingValue(int tipoEnum) {   \n    return lookup.get(tipoEnum);\n  }\n}\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"456\" height=\"93\" src=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5.png\" alt=\"\" class=\"wp-image-1139\" srcset=\"https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5.png 456w, https:\/\/www.pinguytaz.net\/wp-content\/uploads\/2024\/08\/image-5-300x61.png 300w\" sizes=\"auto, (max-width: 456px) 100vw, 456px\" \/><\/figure>\n\n\n\n<p>Ahora definiremos la funci\u00f3n de nuestra extensi\u00f3n que llamaremos \u00ab<strong>LaFuncion<\/strong>\u00bb y que recibir\u00e1 un tipo <em>enum<\/em> llamado \u00ab<strong>TipoEnum<\/strong>\u00ab, los nombres que se mostraran ser\u00e1n los definidos en nuestra enumeraci\u00f3n.<\/p>\n\n\n\n<p>El valor por defecto es el primer valor que definamos pero podr\u00edamos especificar otros si usamos la anotaci\u00f3n <strong>@Default<\/strong> como podemos ver.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UnValor(0),\n  ElUno(1),\n@Default         En este caso el valor por defecto sera \"UnDos\"\n  UnDo(2),\n  Varios(3);<\/code><\/pre>\n\n\n\n<p>Si generamos una nueva versi\u00f3n y eliminamos un valor y queremos indicar que ya no se puede usar tendr\u00edamos que usar la anotaci\u00f3n <strong>@Deprecated<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public String LaFuncion(@Options(TipoEnum.class) final int tipo) {  ...... }<\/code><\/pre>\n\n\n\n<p>Los desplegables que se especifican con la anotaci\u00f3n <strong>@Options<\/strong> que es la que hemos utilizado se puede aplicar en el par\u00e1metros de la funci\u00f3n y en el retorno, ademas se podr\u00e1 utilizar en los par\u00e1metros de los eventos (que veremos m\u00e1s adelante) y en las propiedades, tanto al asignar como a recuperar valor.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Tenemos otra anotaci\u00f3n que nos permite realizar un filtro por ejemplo de ficheros que utiliza la anotaci\u00f3n  <strong>@Asset<\/strong> que nos permite de forma activa realizar filtros de ficheros, en este caso solo se los par\u00e1metros de funciones y la asignaci\u00f3n de propiedades son las que la pueden utilizar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podemos hacer que nuestros par\u00e1metros de funci\u00f3n tengan un tipo personalizado de enum (as\u00ed podremos ver una descripci\u00f3n de lo que pasamos y a la funci\u00f3n le llega un entero que sera m\u00e1s sencillo de tratar que un String y el texto descriptivo del enum ser\u00e1 mas sencillo de modificar. Para este ejemplo tendremos dos [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1139,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-container-style":"default","site-container-layout":"default","site-sidebar-layout":"default","disable-article-header":"default","disable-site-header":"default","disable-site-footer":"default","disable-content-area-spacing":"default","footnotes":""},"categories":[2,6,12],"tags":[199,202,33],"class_list":["post-1136","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-java","category-openjdk","tag-appinventor","tag-enumerados","tag-java"],"_links":{"self":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1136","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/comments?post=1136"}],"version-history":[{"count":7,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1136\/revisions"}],"predecessor-version":[{"id":1163,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/posts\/1136\/revisions\/1163"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media\/1139"}],"wp:attachment":[{"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/media?parent=1136"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/categories?post=1136"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pinguytaz.net\/index.php\/wp-json\/wp\/v2\/tags?post=1136"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}