[{"data":1,"prerenderedAt":831},["ShallowReactive",2],{"navigation_docs":3,"-ejemplos-ejemplo-01":298,"-ejemplos-ejemplo-01-surround":826},[4,18,70,105,149,178,212,257],{"title":5,"path":6,"stem":7,"children":8,"icon":17},"Evaluación","\u002Fintroduction","1.introduction\u002F1.index",[9,12],{"title":10,"path":6,"stem":7,"icon":11},"Método de Evaluación","i-iconamoon-cheque-bold",{"title":13,"path":14,"stem":15,"icon":16},"Plataforma de Aprendizaje","\u002Fintroduction\u002Fplataforma","1.introduction\u002F2.plataforma","i-lucide-book-marked","i-lucide-house",{"title":19,"path":20,"stem":21,"children":22,"icon":25},"Interfaz Gráfica de Usuario","\u002Fgui","2.gui\u002F01.index",[23,26,30,34,38,42,46,50,54,58,62,66],{"title":24,"path":20,"stem":21,"icon":25},"¿Qué es una Interfaz Gráfica de Usuario (GUI)?","i-carbon-gui-management",{"title":27,"path":28,"stem":29,"icon":25},"Creación de Interfaces Gráficas de Usuario (GUI)","\u002Fgui\u002Fbuild-gui","2.gui\u002F02.build-gui",{"title":31,"path":32,"stem":33,"icon":25},"Componentes Básicos de Swing","\u002Fgui\u002Fcomponentes-basicos","2.gui\u002F03.componentes-basicos",{"title":35,"path":36,"stem":37},"El componente JFrame","\u002Fgui\u002Fjframe","2.gui\u002F04.jframe",{"title":39,"path":40,"stem":41},"El componente JPanel","\u002Fgui\u002Fjpanel","2.gui\u002F05.jpanel",{"title":43,"path":44,"stem":45},"El componente JButton","\u002Fgui\u002Fjbutton","2.gui\u002F06.jbutton",{"title":47,"path":48,"stem":49,"icon":25},"Elementos de texto en interfaces gráficas con Swing","\u002Fgui\u002Ftext","2.gui\u002F07.text",{"title":51,"path":52,"stem":53},"Elementos Visuales","\u002Fgui\u002Felementos-visuales","2.gui\u002F08.elementos-visuales",{"title":55,"path":56,"stem":57,"icon":25},"Eventos en Swing","\u002Fgui\u002Feventos","2.gui\u002F09.eventos",{"title":59,"path":60,"stem":61,"icon":25},"Controles en Swing","\u002Fgui\u002Fcontroles","2.gui\u002F10.controles",{"title":63,"path":64,"stem":65,"icon":25},"Atributos Comunes de los Componentes de Diseño","\u002Fgui\u002Fatributos-comunes","2.gui\u002F11.atributos-comunes",{"title":67,"path":68,"stem":69,"icon":25},"Layouts","\u002Fgui\u002Flayout","2.gui\u002F12.layout",{"title":71,"icon":25,"path":72,"stem":73,"children":74,"page":104},"Personalización","\u002Fpersonalizacion","3.personalizacion",[75,79,84,88,92,96,100],{"title":76,"path":77,"stem":78},"Jerarquía de clases en Swing","\u002Fpersonalizacion\u002Fjerarquia","3.personalizacion\u002F01.jerarquia",{"title":80,"path":81,"stem":82,"icon":83},"Personalización Inicial de Componentes Swing","\u002Fpersonalizacion\u002Fpersonalizacion-inicial","3.personalizacion\u002F02.personalizacion-inicial","i-carbon-palette",{"title":85,"path":86,"stem":87,"icon":83},"Tema y Personalización Avanzada en Swing","\u002Fpersonalizacion\u002Ftheme","3.personalizacion\u002F03.theme",{"title":89,"path":90,"stem":91,"icon":83},"Pintando en Swing","\u002Fpersonalizacion\u002Fpaint","3.personalizacion\u002F04.paint",{"title":93,"path":94,"stem":95,"icon":83},"Mi Tema 1: Comenzando con la Personalización","\u002Fpersonalizacion\u002Ftheme-start","3.personalizacion\u002F05.theme-start",{"title":97,"path":98,"stem":99,"icon":83},"UI Delegates: Personalizando la Apariencia de los Componentes","\u002Fpersonalizacion\u002Fui-delegates","3.personalizacion\u002F06.ui-delegates",{"title":101,"path":102,"stem":103,"icon":83},"Empleado delegadores de UI para personalizar la apariencia de los componentes","\u002Fpersonalizacion\u002Ftheme-02","3.personalizacion\u002F07.theme-02",false,{"title":106,"path":107,"stem":108,"children":109,"icon":148},"Programación concurrente","\u002Fconcurrencia","4.concurrencia\u002F01.index",[110,112,116,120,124,128,132,136,140,144],{"title":111,"path":107,"stem":108,"icon":83},"¿Qué es la concurrencia?",{"title":113,"path":114,"stem":115,"icon":83},"Unidades de Ejecución","\u002Fconcurrencia\u002Funidades-ejecucion","4.concurrencia\u002F02.unidades-ejecucion",{"title":117,"path":118,"stem":119,"icon":83},"Programa de flujo único y de flujo múltiple","\u002Fconcurrencia\u002Fflujos","4.concurrencia\u002F03.flujos",{"title":121,"path":122,"stem":123,"icon":83},"Hilos con Thread y Runnable","\u002Fconcurrencia\u002Fthread-runnable","4.concurrencia\u002F04.thread-runnable",{"title":125,"path":126,"stem":127},"Paralelismo V.S. Concurrencia","\u002Fconcurrencia\u002Fparalelismo","4.concurrencia\u002F05.paralelismo",{"title":129,"path":130,"stem":131,"icon":83},"Problemas clásicos de concurrencia","\u002Fconcurrencia\u002Fproblemas","4.concurrencia\u002F06.problemas",{"title":133,"path":134,"stem":135,"icon":83},"Emulando condiciones de carrera en Java","\u002Fconcurrencia\u002Fcondiciones-carrera","4.concurrencia\u002F07.condiciones-carrera",{"title":137,"path":138,"stem":139,"icon":83},"Semáforos en Java","\u002Fconcurrencia\u002Fsemaforos","4.concurrencia\u002F08.semaforos",{"title":141,"path":142,"stem":143,"icon":83},"La clase Timer en Java Swing","\u002Fconcurrencia\u002Ftimer","4.concurrencia\u002F09.timer",{"title":145,"path":146,"stem":147,"icon":83},"Algoritmos de ordenamiento de procesos","\u002Fconcurrencia\u002Falgoritmos-procesos","4.concurrencia\u002F10.algoritmos-procesos","i-carbon-parallel-groups",{"title":150,"path":151,"stem":152,"children":153,"icon":177},"Acceso a datos","\u002Fdatos","5.datos\u002F01.index",[154,157,161,165,169,173],{"title":155,"path":151,"stem":152,"icon":156},"Java y las bases de datos","i-carbon-database",{"title":158,"path":159,"stem":160},"Cliente Servidor","\u002Fdatos\u002Fcliente-servidor","5.datos\u002F02.cliente-servidor",{"title":162,"path":163,"stem":164},"CRUD","\u002Fdatos\u002Fcrud","5.datos\u002F03.crud",{"title":166,"path":167,"stem":168},"Sentencias Preparadas con JDBC","\u002Fdatos\u002Fsentencia-preparada","5.datos\u002F04.sentencia-preparada",{"title":170,"path":171,"stem":172},"DAO (Data Access Object)","\u002Fdatos\u002Fdao","5.datos\u002F05.dao",{"title":174,"path":175,"stem":176},"Usando Hibernate ORM","\u002Fdatos\u002Form","5.datos\u002F06.orm","i-gravity-ui-database-fill",{"title":179,"path":180,"stem":181,"children":182,"icon":211},"Programación móvil","\u002Fmovil","6.movil\u002F01.index",[183,186,191,195,199,203,207],{"title":184,"path":180,"stem":181,"icon":185},"¿Qué es Android y Kotlin?","i-carbon-mobile",{"title":187,"path":188,"stem":189,"icon":190},"¿Qué es Android Studio?","\u002Fmovil\u002Fandroid-studio","6.movil\u002F02.android-studio","i-carbon-application",{"title":192,"path":193,"stem":194,"icon":190},"¿Qué es Jetpack Compose?","\u002Fmovil\u002Fjetpack-compose","6.movil\u002F03.jetpack-compose",{"title":196,"path":197,"stem":198},"Filas y Columnas con Jetpack Compose","\u002Fmovil\u002Ffilas-columnas","6.movil\u002F04.filas-columnas",{"title":200,"path":201,"stem":202,"icon":190},"Componentes Básicos en Jetpack Compose","\u002Fmovil\u002Fcomponentes-basicos","6.movil\u002F05.componentes-basicos",{"title":204,"path":205,"stem":206,"icon":190},"Las Intenciones en Android con Jetpack Compose","\u002Fmovil\u002Fintentions","6.movil\u002F06.intentions",{"title":208,"path":209,"stem":210,"icon":190},"Navegación en Android con Jetpack Compose","\u002Fmovil\u002Fnavegacion","6.movil\u002F07.navegacion","phone_android",{"title":213,"icon":25,"path":214,"stem":215,"children":216,"page":104},"Ejemplos","\u002Fejemplos","7.ejemplos",[217,221,225,229,233,237,241,245,249,253],{"title":218,"path":219,"stem":220},"Ejemplo 01: Creando un validador abstracto de expresiones","\u002Fejemplos\u002Fejemplo-01","7.ejemplos\u002F01.ejemplo-01",{"title":222,"path":223,"stem":224},"Ejemplo 02: Diferencias de validar un JTextField y un JFormattedTextField","\u002Fejemplos\u002Fejemplo-02","7.ejemplos\u002F02.ejemplo-02",{"title":226,"path":227,"stem":228},"Ejemplo 03: Creando una Aplicación con GUI en Java Swing","\u002Fejemplos\u002Fejemplo-03","7.ejemplos\u002F03.ejemplo-03",{"title":230,"path":231,"stem":232},"Ejemplo 4: Estilizando componentes Swing con Delegadores","\u002Fejemplos\u002Fejemplo-04","7.ejemplos\u002F04.ejemplo-04",{"title":234,"path":235,"stem":236,"icon":83},"Ejemplo 5: Uso de Hilos con Thread y Runnable","\u002Fejemplos\u002Fejemplo-05","7.ejemplos\u002F05.ejemplo-05",{"title":238,"path":239,"stem":240,"icon":83},"Ejemplo 06: Manejando Hilos de formas Diferentes en Java","\u002Fejemplos\u002Fejemplo-06","7.ejemplos\u002F06.ejemplo-06",{"title":242,"path":243,"stem":244,"icon":83},"Ejemplo 7: Condiciones de carrera en Java","\u002Fejemplos\u002Fejemplo-07","7.ejemplos\u002F07.ejemplo-07",{"title":246,"path":247,"stem":248,"icon":83},"Ejemplo 8: Control de acceso a recursos compartidos con semáforos","\u002Fejemplos\u002Fejemplo-08","7.ejemplos\u002F08.ejemplo-08",{"title":250,"path":251,"stem":252,"icon":83},"Ejemplo 9: El restaurante y los pedidos","\u002Fejemplos\u002Fejemplo-09","7.ejemplos\u002F09.ejemplo-09",{"title":254,"path":255,"stem":256},"Ejemplo 10: Proceso FIFO (First In, First Out) con Semáforos y Swing","\u002Fejemplos\u002Fejemplo-10","7.ejemplos\u002F10.ejemplo-10",{"title":258,"icon":25,"path":259,"stem":260,"children":261,"page":104},"Actividades","\u002Factividades","8.actividades",[262,266,270,274,278,282,286,290,294],{"title":263,"path":264,"stem":265,"icon":25},"Actividad 1: Introducción al diseño de interfaces","\u002Factividades\u002Fact-01","8.actividades\u002F01.act-01",{"title":267,"path":268,"stem":269,"icon":25},"Actividad 2: Diseño de wireframes y prototipos","\u002Factividades\u002Fact-02","8.actividades\u002F02.act-02",{"title":271,"path":272,"stem":273,"icon":25},"Actividad 3: Propuesta de Proyecto y Wireframe inicial","\u002Factividades\u002Fact-03","8.actividades\u002F03.act-03",{"title":275,"path":276,"stem":277,"icon":83},"Actividad 4: Temas y Componentes Personalizados en Swing","\u002Factividades\u002Fact-04","8.actividades\u002F04.act-04",{"title":279,"path":280,"stem":281,"icon":83},"Actividad 5: Explicando la Concurrencia a un Niño de 5 Años","\u002Factividades\u002Fact-05","8.actividades\u002F05.act-05",{"title":283,"path":284,"stem":285,"icon":83},"Actividad 6: Simulación de una cocina con múltiples chefs (hilos)","\u002Factividades\u002Fact-06","8.actividades\u002F06.act-06",{"title":287,"path":288,"stem":289,"icon":83},"Actividad 7: Sistema de retiro bancario","\u002Factividades\u002Fact-07","8.actividades\u002F07.act-07",{"title":291,"path":292,"stem":293,"icon":83},"Actividad 8: Simulación de Round Robin con hilos e Interfaz Gráfica","\u002Factividades\u002Fact-08","8.actividades\u002F08.act-08",{"title":295,"path":296,"stem":297,"icon":83},"Actividad 9: CRUD con Hibernate y Swing","\u002Factividades\u002Fact-09","8.actividades\u002F09.act-09",{"id":299,"title":218,"body":300,"description":820,"extension":821,"links":822,"meta":823,"navigation":351,"path":219,"seo":824,"stem":220,"__hash__":825},"docs\u002F7.ejemplos\u002F01.ejemplo-01.md",{"type":301,"value":302,"toc":818},"minimark",[303,316,557,566,637,643,789,805,811,814],[304,305,306,307,311,312,315],"p",{},"En este ejemplo, crearemos una clase abstracta llamada ",[308,309,310],"code",{},"AbstractRegexValidator"," que definirá un método abstracto para validar cadenas utilizando expresiones regulares. Luego, implementaremos una subclase concreta llamada ",[308,313,314],{},"EmailValidator"," que validará direcciones de correo electrónico.",[317,318,323],"pre",{"className":319,"code":320,"language":321,"meta":322,"style":322},"language-java shiki shiki-themes github-dark","import java.util.regex.Pattern;\nimport java.util.regex.Matcher;\n\npublic abstract class AbstractRegexValidator {\n    private Pattern pattern;\n\n    public AbstractRegexValidator(String regex) {\n        this.pattern = Pattern.compile(regex);\n    }\n\n    @Override\n    public Object stringToValue(String text) throws ParseException {\n        if(pattern.matcher(text).matches()) {\n            return text;\n        } else {\n            throw new ParseException(\"Formato inválido\", 0);\n        }\n    }\n}\n","java","",[308,324,325,338,346,353,372,381,386,404,426,432,437,446,471,492,501,512,540,546,551],{"__ignoreMap":322},[326,327,330,334],"span",{"class":328,"line":329},"line",1,[326,331,333],{"class":332},"snl16","import",[326,335,337],{"class":336},"s95oV"," java.util.regex.Pattern;\n",[326,339,341,343],{"class":328,"line":340},2,[326,342,333],{"class":332},[326,344,345],{"class":336}," java.util.regex.Matcher;\n",[326,347,349],{"class":328,"line":348},3,[326,350,352],{"emptyLinePlaceholder":351},true,"\n",[326,354,356,359,362,365,369],{"class":328,"line":355},4,[326,357,358],{"class":332},"public",[326,360,361],{"class":332}," abstract",[326,363,364],{"class":332}," class",[326,366,368],{"class":367},"svObZ"," AbstractRegexValidator",[326,370,371],{"class":336}," {\n",[326,373,375,378],{"class":328,"line":374},5,[326,376,377],{"class":332},"    private",[326,379,380],{"class":336}," Pattern pattern;\n",[326,382,384],{"class":328,"line":383},6,[326,385,352],{"emptyLinePlaceholder":351},[326,387,389,392,394,397,401],{"class":328,"line":388},7,[326,390,391],{"class":332},"    public",[326,393,368],{"class":367},[326,395,396],{"class":336},"(String ",[326,398,400],{"class":399},"s9osk","regex",[326,402,403],{"class":336},") {\n",[326,405,407,411,414,417,420,423],{"class":328,"line":406},8,[326,408,410],{"class":409},"sDLfK","        this",[326,412,413],{"class":336},".pattern ",[326,415,416],{"class":332},"=",[326,418,419],{"class":336}," Pattern.",[326,421,422],{"class":367},"compile",[326,424,425],{"class":336},"(regex);\n",[326,427,429],{"class":328,"line":428},9,[326,430,431],{"class":336},"    }\n",[326,433,435],{"class":328,"line":434},10,[326,436,352],{"emptyLinePlaceholder":351},[326,438,440,443],{"class":328,"line":439},11,[326,441,442],{"class":336},"    @",[326,444,445],{"class":332},"Override\n",[326,447,449,451,454,457,459,462,465,468],{"class":328,"line":448},12,[326,450,391],{"class":332},[326,452,453],{"class":336}," Object ",[326,455,456],{"class":367},"stringToValue",[326,458,396],{"class":336},[326,460,461],{"class":399},"text",[326,463,464],{"class":336},") ",[326,466,467],{"class":332},"throws",[326,469,470],{"class":336}," ParseException {\n",[326,472,474,477,480,483,486,489],{"class":328,"line":473},13,[326,475,476],{"class":332},"        if",[326,478,479],{"class":336},"(pattern.",[326,481,482],{"class":367},"matcher",[326,484,485],{"class":336},"(text).",[326,487,488],{"class":367},"matches",[326,490,491],{"class":336},"()) {\n",[326,493,495,498],{"class":328,"line":494},14,[326,496,497],{"class":332},"            return",[326,499,500],{"class":336}," text;\n",[326,502,504,507,510],{"class":328,"line":503},15,[326,505,506],{"class":336},"        } ",[326,508,509],{"class":332},"else",[326,511,371],{"class":336},[326,513,515,518,521,524,527,531,534,537],{"class":328,"line":514},16,[326,516,517],{"class":332},"            throw",[326,519,520],{"class":332}," new",[326,522,523],{"class":367}," ParseException",[326,525,526],{"class":336},"(",[326,528,530],{"class":529},"sU2Wk","\"Formato inválido\"",[326,532,533],{"class":336},", ",[326,535,536],{"class":409},"0",[326,538,539],{"class":336},");\n",[326,541,543],{"class":328,"line":542},17,[326,544,545],{"class":336},"        }\n",[326,547,549],{"class":328,"line":548},18,[326,550,431],{"class":336},[326,552,554],{"class":328,"line":553},19,[326,555,556],{"class":336},"}\n",[304,558,559,560,562,563,565],{},"Ahora, implementemos la subclase concreta ",[308,561,314],{}," que extiende ",[308,564,310],{}," y utiliza una expresión regular para validar direcciones de correo electrónico.",[317,567,569],{"className":319,"code":568,"language":321,"meta":322,"style":322},"public class EmailValidator extends AbstractRegexValidator {\n    private static final String EMAIL_REGEX = \"^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$\";\n\n    public EmailValidator() {\n        super(EMAIL_REGEX);\n    }\n}\n",[308,570,571,587,608,612,621,629,633],{"__ignoreMap":322},[326,572,573,575,577,580,583,585],{"class":328,"line":329},[326,574,358],{"class":332},[326,576,364],{"class":332},[326,578,579],{"class":367}," EmailValidator",[326,581,582],{"class":332}," extends",[326,584,368],{"class":367},[326,586,371],{"class":336},[326,588,589,591,594,597,600,602,605],{"class":328,"line":340},[326,590,377],{"class":332},[326,592,593],{"class":332}," static",[326,595,596],{"class":332}," final",[326,598,599],{"class":336}," String EMAIL_REGEX ",[326,601,416],{"class":332},[326,603,604],{"class":529}," \"^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$\"",[326,606,607],{"class":336},";\n",[326,609,610],{"class":328,"line":348},[326,611,352],{"emptyLinePlaceholder":351},[326,613,614,616,618],{"class":328,"line":355},[326,615,391],{"class":332},[326,617,579],{"class":367},[326,619,620],{"class":336},"() {\n",[326,622,623,626],{"class":328,"line":374},[326,624,625],{"class":409},"        super",[326,627,628],{"class":336},"(EMAIL_REGEX);\n",[326,630,631],{"class":328,"line":383},[326,632,431],{"class":336},[326,634,635],{"class":328,"line":388},[326,636,556],{"class":336},[304,638,639,640,642],{},"Con esta implementación, ahora podemos crear una instancia de ",[308,641,314],{}," y utilizarla para validar direcciones de correo electrónico:",[317,644,646],{"className":319,"code":645,"language":321,"meta":322,"style":322},"public class Main {\n    void main() {\n        EmailValidator emailValidator = new EmailValidator();\n\n        String email1 = \"test@correo.com\";\n        String email2 = \"invalid-email\";\n        try {\n            System.out.println(emailValidator.stringToValue(email1)); \n            System.out.println(emailValidator.stringToValue(email2)); \n        } catch (ParseException e) {\n            System.out.println(e.getMessage());\n        }\n    }\n}\n",[308,647,648,659,669,683,687,699,711,718,734,747,762,777,781,785],{"__ignoreMap":322},[326,649,650,652,654,657],{"class":328,"line":329},[326,651,358],{"class":332},[326,653,364],{"class":332},[326,655,656],{"class":367}," Main",[326,658,371],{"class":336},[326,660,661,664,667],{"class":328,"line":340},[326,662,663],{"class":332},"    void",[326,665,666],{"class":367}," main",[326,668,620],{"class":336},[326,670,671,674,676,678,680],{"class":328,"line":348},[326,672,673],{"class":336},"        EmailValidator emailValidator ",[326,675,416],{"class":332},[326,677,520],{"class":332},[326,679,579],{"class":367},[326,681,682],{"class":336},"();\n",[326,684,685],{"class":328,"line":355},[326,686,352],{"emptyLinePlaceholder":351},[326,688,689,692,694,697],{"class":328,"line":374},[326,690,691],{"class":336},"        String email1 ",[326,693,416],{"class":332},[326,695,696],{"class":529}," \"test@correo.com\"",[326,698,607],{"class":336},[326,700,701,704,706,709],{"class":328,"line":383},[326,702,703],{"class":336},"        String email2 ",[326,705,416],{"class":332},[326,707,708],{"class":529}," \"invalid-email\"",[326,710,607],{"class":336},[326,712,713,716],{"class":328,"line":388},[326,714,715],{"class":332},"        try",[326,717,371],{"class":336},[326,719,720,723,726,729,731],{"class":328,"line":406},[326,721,722],{"class":336},"            System.out.",[326,724,725],{"class":367},"println",[326,727,728],{"class":336},"(emailValidator.",[326,730,456],{"class":367},[326,732,733],{"class":336},"(email1)); \n",[326,735,736,738,740,742,744],{"class":328,"line":428},[326,737,722],{"class":336},[326,739,725],{"class":367},[326,741,728],{"class":336},[326,743,456],{"class":367},[326,745,746],{"class":336},"(email2)); \n",[326,748,749,751,754,757,760],{"class":328,"line":434},[326,750,506],{"class":336},[326,752,753],{"class":332},"catch",[326,755,756],{"class":336}," (ParseException ",[326,758,759],{"class":399},"e",[326,761,403],{"class":336},[326,763,764,766,768,771,774],{"class":328,"line":439},[326,765,722],{"class":336},[326,767,725],{"class":367},[326,769,770],{"class":336},"(e.",[326,772,773],{"class":367},"getMessage",[326,775,776],{"class":336},"());\n",[326,778,779],{"class":328,"line":448},[326,780,545],{"class":336},[326,782,783],{"class":328,"line":473},[326,784,431],{"class":336},[326,786,787],{"class":328,"line":494},[326,788,556],{"class":336},[304,790,791,792,794,795,797,798,801,802,804],{},"En este ejemplo, el método ",[308,793,456],{}," de la clase ",[308,796,310],{}," verifica si la cadena de texto coincide con la expresión regular definida. Si coincide, devuelve la cadena; de lo contrario, lanza una excepción ",[308,799,800],{},"ParseException",". La clase ",[308,803,314],{}," proporciona la expresión regular específica para validar direcciones de correo electrónico.",[304,806,807,808,810],{},"Este enfoque permite una fácil reutilización del código, ya que cualquier otra clase que necesite validar diferentes tipos de cadenas puede extender ",[308,809,310],{}," y proporcionar su propia expresión regular.",[304,812,813],{},"Recuerda que este validador es posible implementarlo en cualquier contexto donde se necesite validar cadenas de texto, como formularios de entrada, validación de datos, etc.",[815,816,817],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":322,"searchDepth":340,"depth":340,"links":819},[],"En este ejemplo, crearemos una clase abstracta para validar expresiones regulares y luego implementaremos una subclase concreta que valide direcciones de correo electrónico.","md",null,{"editButton":104},{"title":218,"description":820},"O0gQw-l_IOo74JdPEjB_Xl53o7AOz9frB7gKT0RQuuo",[827,829],{"title":208,"path":209,"stem":210,"description":828,"icon":190,"children":-1},"Aprende a implementar la navegación entre pantallas en Android utilizando Jetpack Compose y el componente de navegación.",{"title":222,"path":223,"stem":224,"description":830,"children":-1},"En este ejemplo, compararemos la validación de un `JTextField` con la validación de un `JFormattedTextField` utilizando una máscara de formato.",1775101375285]