Nesse post irei falar sobre minha experiência com Java durante o período de desenvolvimento até então.
Em primeiro lugar, iniciei o estudo da linguagem Java e suas principais características. Até então não possuía uma experiência aprofundada com linguagens gerenciadas. Assim, percebi que o Java usa em grande quantidade os conceitos de Design Patterns que gostaria de reforçar neste projeto.
O primeiro aspecto que me chamou a atenção foi a forma como a linguagem trabalha para ser multiplataforma. O Java roda sobre uma Máquina Virtual (JVM), a qual tem como responsabilidade isolar o aplicativo do Sistema Operacional em questão. Após compilado, o código Java transforma-se em bytecode, sendo este o código de máquina da JVM.
Esse bytecode, apesar de interessante, tem alguns problemas no que referem à facilidade de observá-lo e entender o código Java que está por trás dele. Isso torna o Java uma linguagem meio perigosa no quesito facilidade de engenharia reversa, e ofuscadores de código podem vir chegar a serem necessários para impedir essa leitura.
Com relação à linguagem, Java é mais fortemente tipado do que C++, o que acaba forçado a realizar casts para tudo. O operador ternário também exige uma variável para armazenar o retorno.
Também programando em Java passei a utilizar mais loops ao estilo foreach, e também achei interessante o caso dos LABELED LOOPS que aparentemente foram desenvolvidos para evitar a única possível necessidade de um goto em Java.
Com Java, passei a trabalhar pela primeira vez em um projeto envolvendo multithreads, e "felizes" foram os momentos em que eu descobri que um erro estava sendo causado pela ausência de um semáforo, o que me fez entender alguns casos críticos famosos de se trabalhar com multiplas threads.
Outro aspecto interessante da linguagem é a sua ausência de sobrecarga de operadores. É muito estranho trabalhar assim com certas classes matemáticas como matrizes e vetores, pois nada fica tão natural usando apenas métodos como ficaria usando os operadores.
Além disso, achei interessante a forma como Java trabalha com a diferença entre classes abstratas e interfaces. Utilizei muito de ambas para fortalecer os princípios de um bom código Orientado a Objetos. Muitas coisas na linguagem se fortalecem no princípio do uso de interfaces, como por exemplo tornar um objeto clonável.
Cada objeto criado em Java é filho de uma classe do tipo Object, a qual contém um método para impressão de dados (semelhante a uma sobrecarga de um operador << e >> em C++), métodos para facilitar o uso do objeto dentro de threads, dentre outros. Os métodos dessa classe também podem ser sobrescritos para que se programe o comportamento desejado.
Também me confundi em alguns momentos enquanto trabalhava com cópias, pois toda passagem de parâmetro em java trabalha por padrão com referências, necessitando de especificações mais braçais para que uma cópia efetiva do objeto seja efetuada.
O último aspecto da linguagem que gostaria de reforçar são as Inner Classes e Annonymous Inner Classes. Ambas as formas de implementação são estranhas à linguagem C++ com que eu estava habituado.
Inner Classes são classes que criamos dentro de outras classes. Para criar objetos das mesmas é necessário ter acesso à classe que a contém, e de métodos factory para gerar objetos.
Annonymous Inner Classes são classes que especificamos diretamente na passagem de um argumento que recebe uma classe contendo a implementação da interface ou classe abstrata. Isso possibilita que não necessitemos implementar uma classe que usaremos uma única vez em uma passagem de parâmetro
Bem, por hora é só. No proximo post estarei falando sobre a minha experiência com o compilador Eclipse, sendo este o segundo objetivo do trabalho com Android.
SEE YOU NEXT MISSION
Nenhum comentário:
Postar um comentário
Obrigado por deixar a sua participação!