{"id":28224281,"url":"https://github.com/devbigode/java-core","last_synced_at":"2025-06-12T03:30:37.662Z","repository":{"id":289345441,"uuid":"970926915","full_name":"devbigode/java-core","owner":"devbigode","description":null,"archived":false,"fork":false,"pushed_at":"2025-05-05T23:38:20.000Z","size":243,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-18T09:11:32.719Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devbigode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-22T18:42:13.000Z","updated_at":"2025-05-05T23:38:24.000Z","dependencies_parsed_at":"2025-04-22T20:32:45.131Z","dependency_job_id":"b9e06c7c-8d0b-43ae-8ee9-cab773984719","html_url":"https://github.com/devbigode/java-core","commit_stats":null,"previous_names":["devbigode/java-core"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/devbigode/java-core","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbigode%2Fjava-core","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbigode%2Fjava-core/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbigode%2Fjava-core/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbigode%2Fjava-core/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devbigode","download_url":"https://codeload.github.com/devbigode/java-core/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devbigode%2Fjava-core/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259389536,"owners_count":22850025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-05-18T09:11:17.012Z","updated_at":"2025-06-12T03:30:37.652Z","avatar_url":"https://github.com/devbigode.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n## Aulas 64 a 66 - Associação unidirecional\n\n### 1. Exemplo um para muitos:\n\n~~~\npublic class Player {\n    private String name;\n    private String position;\n    private int age;\n\n    /* Muitos jogadores têm apenas um clube */\n    private Team team;\n    \n    ...\n    \n}\n~~~\n\n#### Os jogadores podem compartilhar do mesmo clube/time, mas só poderão ter apenas um. Ao contrário de um clube, que pode ter muitos jogadores associados a ele.\n\n### 2. Exemplo muitos para um:\n\n~~~\npublic class School {\n    private String name;\n    private String director;\n    private Student[] students;\n\n    ...\n    \n    @Override\n    public String toString() {\n        return \"School{\" +\n                \"name='\" + name + '\\'' +\n                \", director='\" + director + '\\'' +\n                \", students=\" + Arrays.toString(students) +\n                '}';\n    }\n    \n}\n~~~\n\n#### Uma escola pode ter múltiplos alunos associados a ela, mas um estudante só pode estar matriculado numa escola.\n\n---\n## Aulas 95 a 104 - Destrinchando exceções\n\n![img.png](src/assets/images/img.png)\n\n### Error x Exception:\n\n- A maioria dos casos de erros não são causados pelo nosso programa estes são devido à falta de recursos do sistema e estes não são recuperáveis.\n- A maioria dos casos de exceções são causadas pelo nosso programa e estes são recuperáveis.\n\n### Tipos de exceções:\n\n#### Checked:\n\n- São lançadas em tempo de compilação e herdam da Classe Exception.\n\n#### Unchecked:\n\n- São lançadas em tempo de execução e herdam da Classe RuntimeException.\n\n![img_1.png](src/assets/images/img_1.png)\n\n### Variações ao implementar exceções:\n\n#### Try-with-resources:\n\n- A fim de evitar o uso do bloco finally{}, usa-se a seguinte estrutura:\n\n~~~\ntry (Scanner input = new Scanner(System.in);\n     BufferedReader br = new BufferedReader(new FileReader(\"file.txt\"))) {\n     \n     ...\n\n    } catch (Exception e) {\n        e.printStackTrace();  \n    }       \n~~~\n\n#### Essa estrutura abstrai a execução dos métodos input.close() e br.close(). Muito por conta disso, tem-se a seguinte regra de uso:\n\n- Pode-se passar como recurso, somente objetos de classes que implementem Closeable ou AutoCloseable. Pois o objetivo desta implementação é sempre fechar algo, pode ser uma conexão com um banco, um arquivo, etc.\n- Como a classe Scanner: public final class Scanner implements Iterator\u003cString\u003e, Closeable {...}\n\n#### Múltiplos catches e catch em linha:\n\n- Multi-catch:\n~~~\ntry {\n    ...\n    } catch (FileNotFoundException e) {\n        e.printStackTrace();\n    } catch (Exception e) {\n       e.printStackTrace();\n    } \n~~~\n\n#### A ordem das exceções deve ser das mais específicas para as generalistas.\n\n- catch in line:\n~~~\ntry {\n    ...\n    } catch (InvalidLoginException | InputMismatchException e) {\n        if (e instanceof InputMismatchException) {\n            System.out.println(\"A senha informada contém caracteres diferentes do permitido.\");\n            } else {\n                e.printStackTrace();\n            }\n    }\n~~~\n\n#### Não se pode agrupar exceções da mesma hierarquia de herança. \n\n- Isso ocorre porque, no bloco catch (A | B e), o compilador trata e como efetivamente final, ou seja, você não pode reatribuir ou fazer downcast direto com segurança.\n- Ao usar InputMismatchException e NoSuchElementException em linha, o programa retornará erro na primeira exceção, uma vez que ela é filha da segunda.\n\n---\n## Aulas 106 e 107 - Wrappers\n\n#### As classes especiais Wrappers, dão mais poder às variáveis primitivas. Transformando-as em um Objeto com diversos métodos úteis.\n\n- Boxing ou autoboxing e unboxing:\n\n~~~\nCharacter character = '1'; // autoboxing\n\nboolean bool = Character.isLetter(character);\n\nchar ch = character; // unboxing\n\nSystem.out.println(bool + \" | \" + ch); // Saída esperada: false | 1\n~~~\n\n#### Boxing consiste em \"embrulhar\" uma variável primitiva em um objeto Wrapper, o que inspira seu nome.\n\n---\n## Aulas 108 a 111 - String vs StringBuilder vs StringBuffer\n\n#### Entendendo as diferenças entre as três abordagens para manipulação de texto:\n\n- **String**: Imutável. Toda modificação gera um novo objeto na memória.\n- **StringBuilder**: Mutável e mais performática, indicada para uso em ambientes de thread única.\n- **StringBuffer**: Mutável e segura para múltiplas threads, mas menos performática que o StringBuilder por conta da sincronização.\n\n~~~\nString nome = \"Ana\";\nnome += \" Silva\"; // Cria um novo objeto: \"Ana Silva\"\n~~~\n\n#### Nesse exemplo, temos três objetos String:\n- `\"Ana\"` (literal)\n- `\" Silva\"` (literal)\n- `\"Ana Silva\"` (objeto novo criado na concatenação)\n\n\n### String Pool (intern pool)\n\n#### O String Pool é uma área de memória especial usada para armazenar strings literais reutilizáveis. Exemplo:\n\n~~~\nString a = \"Teste\";\nString b = \"Teste\";\nSystem.out.println(a == b); // true, ambos apontam para o mesmo objeto no pool\n\nString c = new String(\"Teste\");\nSystem.out.println(a == c); // false, c é um novo objeto no heap\n\nString d = new String(\"Teste\").intern();\nSystem.out.println(a == d); // true, d foi movido para o pool\n~~~\n\n- Strings criadas com `new` não são automaticamente adicionadas ao pool.\n- O método `intern()` adiciona a string ao pool, se ainda não estiver lá.\n\n#### O uso do pool melhora a eficiência de memória e evita duplicação desnecessária de dados imutáveis.\n\n---\n## Aulas 131 a 136 - Regex\n\n### Diferença entre matches() e find():\n\n- **matches()**: tenta casar o texto inteiro com o padrão.\n- **find()**: procura ocorrências válidas num texto maior, mesmo que ele não obedeça 100% ao padrão.\n\n[Ver exemplo PatternMatcherTest.java](src/devdojo/regex/test/PatternMatcherTest.java)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevbigode%2Fjava-core","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevbigode%2Fjava-core","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevbigode%2Fjava-core/lists"}