domingo, 6 de maio de 2012

Operadores do Java



Operadores Aritméticos

      +      

Soma, utilizado para somar valores ou concatenar strings.

int A = 20;
int B = 30;
int C;
C = A + B;
print( C ); // 50

O exemplo representa a soma de dois inteiros.

String D;
D = A + B; 


Neste caso o compilador gera um erro, não pode atribuir um inteiro a uma string.

D = "" + A + B; 

Neste caso compila, porém o resultado não é 50, e sim 2030, os valores foram concatenados.

D = "" + ( A + B ); 

Usando o parenteses, primeiro é somado os valores A e B, depois concatenados a string, agora o resultado é o esperado: 50.

Outra forma de obter o mesmo resultado:


C = new Integer(A + B).toString();

byte A = 127;
byte B = 1;
byte C;
C = (byte)(A+B);
print( C ); // -128

O resultado esperado seria 128, mas resultou em -128 por que?
Vamos lembrar dos limites do byte, que varia de -128 a 127, logo se estourar a capacidade o valor da variável gira para o próximo valor.

O mesmo acontece com o código abaixo, a expressão A < 128 é sempre verdadeira, quando o A for 127 e adicionado mais um em A++, o A vira -128, e a condição é sempre verdadeira, ficando num loop eterno.

byte A = 0;
while( A < 128 )  // Nunca será maior que 127.
{
  A++;
  ...
}


      -      

Subtração, utilizado para subtrair valores. Este operador, diferentemente do operador "+", não é utilizado com String, apenas com valores numéricos.


      *      

Multiplicação, utilizado para multiplicar dois operandos.


      /      

Divisão, utilizado para dividir dois operandos. Quando os operandos forem dois inteiros, o resultado é um inteiro truncado.

int A = 5;
int B = 2;


print( A / B ); // 2


      %      

Resto da divisão (Módulo).

int A = 5
int B = 2
print( A % B ); // 1 

Alguns programadores utilizam para saber se  um número é par ou impar.

if( ( Value % 2 ) == 0 )
{
   ... Par
}

A forma mais eficiente para verificar se um número é par ou impar, é utilizando o AND binário (&).


if( ( A & 0x01 ) == 0 ) )


{
   ... Par
}


Verifique o bit da posição 0 da sequência binária, sempre que o número é par, este bit é zero, quando é impar o bit é um, logo a comparação ( A & 0x01 ) == 0 ) vai indicar se o número é par ou impar.


Operadores de atribuição

      =      

Atribui o valor da direita  na "variável" a esquerda.

int A  = 4;
int C, D, E = A;

Para atribuir mais de uma variável, basta coloca-las em sequência, neste exemplo C D e E terão o valor de A que é 4.

Diferente de outras linguagens, uma atribuição não pode ser feita durante uma condição.
if( A = 4 ) // Erro de compilação

O código acima gera um erro de compilação. Devido ao histórico de erros cometidos por programadores em linguagens como o "C", que permite esta sintaxe, no Java foi excluída justamente para evitar erros de codificação, pois neste casso o programador poderia estar com a intenção de comparar o A com o 4, e não de atribuir o valor.

Pode-se utiliza-lo em conjunto com os operadores aritméticos:
+=   Ex: Total += 30;   Equivalente a: Total = Total + 30;
-=    Ex: Total -= 30;    Equivalente a: Total = Total - 30;
*=    Ex: Total += 30;   Equivalente a: Total = Total + 30;
/=     Ex: Total /= 30;    Equivalente a: Total = Total / 30;
%=   Ex: Total %= 30;  Equivalente a: Total = Total % 30;


Operadores de objeto

      instanceof      

Operador instanceof, permite verificar se um objeto é de um determinado tipo de classe.


if( ObjectCar instanceof JVehicle )

Verifica se o objeto ObjectCar é do tipo JVehicle.


Operadores de incremento

Operadores de incremento e decremento, permitem incrementar ou decrementar uma variável.
Ex: Total--; Equivalente a Total = Total - 1
Total++; Equivalente a Total = Total + 1

Cuidado com resultados não esperados quando alterado a precedência dos operadores.
Ex:

Total = 0;
while( Total++ < 2 )
{
   print( "Total = " + Total );
}


A saída será:
Total = 1
Total = 2

Primeiro a variável Total é comparada com 2, depois é somado um a variável Total.


Total = 0;
while( ++Total < 2 )
{
   print( "Total " + Total );
}

A saída será:
Total = 1

Primeiro é somado um a variável Total, depois comparado com 2.


Operadores de comparação

Utilizados para comparar variáveis com determinados valores.

      >      

Maior que, utilizado para comparar se o operando da esquerda é maior que o da direita.


if( Total > 100 )
....
StringValueA = "A";
StringValueB = "B";

if( ValueA > ValueB  ) // Errado

Gera um erro de compilação, para comparar duas strings utilize o método compareTo

if( ValueA.compareTo( valueB  ) > 0 )

Se for verdadeiro ValueA é maior que ValueB.

if( ValueA.compareTo( valueB  ) < 0 )

Se for verdadeiro ValueA é menor que ValueB.

if( ValueA.compareTo( valueB  ) == 0 )

Se for verdadeiro ValueA é igual a ValueB.


OBS: Lembre-se!!! Quando uma string é comparada usa-se a precedência da tabela ASCII, ou dependendo do idioma, verificar a tabela correspondente. Exemplo:

0 = 48
...
9 = 57

...
A = 65
B = 66
C = 67
....


      <      

Menor que, utilizado para comparar se o operando da esquerda é menor que o da direita.
Ex: if( Total < 10 )


      ==     

Comparação, utilizado para comparar se o operando da esquerda é igual ao valor da direita.
Ex: if( Total == 0 )

Comparação de String.
Não compare duas strings desta forma, utilize o método equals para fazer comparações.

String  ValueString = "Teste";


if( "Teste" == "Teste") // Errado
if( ValueString == "Teste") // Errado

Utilize o método equals do objeto que é uma String:


if( "Teste".equals( "Teste" ) )
if( ValueString.equals( "Teste" ) )


Comparação de inteiros.


int A = 5;
int B = 5;

if( A == B )

Retorna verdadeiro, pois o valor de A é igual ao valor de B.

Integer A = new Integer(5);
Integer B = new Integer(5);

if( A == B ) // Errado

Retorna falso, o que está sendo comparado são dois objetos,e  não seus valores. Para comparar os valores de dois objetos do tipo Integer, utilize o método equals:


if( A.equals(B) ) //Certo

Utilize "==" para comparar objetos, quando precisar saber se duas variáveis apontam para o mesmo objeto.

JFrame FrameUser = new JFrame();
...
JFrame CurrentFrame = FrameUser;
...
if( CurrentFrame == FrameUser )



      !=      


Diferente, utilizado para comparar se operando da esquerda é diferente do operando da direita.

if( A != B )



      >=      


Maior ou igual, utilizado para comparar se operando da esquerda é maior ou igual o operando da direita.

if( A >= B )



      <=      


Menor ou igual, utilizado para comparar se operando da esquerda é menor ou igual o operando da direita.

if( A <= B )


Operadores lógicos

      &&      

Condição que retorna verdadeiro quando uma das condições for verdadeira.

if( Total > 100 && Total < 200 )

Retorna verdadeiro se o Total for maior que 100 e se o Total for menor que 200.

Result = ( X == 5 && Total == 100 );

Retorna um valor booleano falso ou verdadeiro, conforme o resultado da comparação efetuada.



      ||      


Condição que retorna verdadeiro se uma as condições for verdadeira.

if( Total > 100 || Saldo < 200 )



      !       


Nega uma condição, se o retorno da condição for verdadeiro retorna falso, se o retorno da condição for falso retorna verdadeiro.


if( !(Total > 100 && Saldo < 200) )

Retorna verdadeiro se a condição avaliada for falsa.



Operadores binários


Operações utilizadas para comparações e tratamentos a nível binário.




      >>      

Deslocamento à direita dos bits, conforme operando.

byte Value = 4;
BinaryPrint( Value ); // 00000100
Value = Value >> 1;
BinaryPrint( Value ); // 00000010

Conforme apresentado, ocorreu o deslocamento de um bit para a direita.



      <<      


Deslocamento à esquerda dos bits, conforme operando.

byte Value = 2;
BinaryPrint( Value ); // 00000010
Value = Value < 1;
BinaryPrint( Value ); // 00000100

Conforme apresentado, ocorreu o deslocamento de um bit para a esquerda.



      &       


Operação AND bit a bit, retorna verdadeiro quando os dois bits estão ligados (1). 

byte ValueA = 2;
byte ValueB = 3;
byte ValueC;
BinaryPrint( ValueA ); // 00000010
BinaryPrint( ValueB ); // 00000011
ValueC = ValueA & ValueB;
BinaryPrint( ValueC ); // 00000010

ValueC tem o retorno da comparação de 00000010 & 00000011, que neste caso os únicos bits ligados nas duas variáveis é o bit 1.

Byte                     -  0 0 0 0 0 0 0 0 
Posição dos bits   -  7 6 5 4 3 2 1 0


      |       

Operação OR bit a bit, retorna verdadeiro quando um dos bits está ligado (1).

byte ValueA = 2;
byte ValueB = 3;
byte ValueC;
BinaryPrint( ValueA ); // 00000010
BinaryPrint( ValueB ); // 00000011
ValueC = ValueA & ValueB;
BinaryPrint( ValueC ); // 00000011

ValueC tem o retorno da comparação de 00000010 | 00000011, que neste caso os únicos bits ligados são o bit 0 e o bit 1.


      ^       

Operação OR exclusiva bit a bit, retorna verdadeiro quando somente um dos bits está ligado (1).

byte ValueA = 46;
byte ValueB = 26;
int ValueC;
BinaryPrint( ValueA ); // 00101110
BinaryPrint( ValueB ); // 00011010
ValueC = ValueA & ValueB;
BinaryPrint( ValueC ); // 00110100

ValueC tem o retorno da comparação de 00101110 | 00011010, que neste caso os únicos bits ligados somente uma vez são o bit 2, 4 e o bit 5.


      ~       

Operação NOT bit a bit, inverte o estado do bit, utilizado com um único operando.

byte ValueA = 255;
BinaryPrint( ValueA ); // 11111111
ValueA = ~ValueA;
BinaryPrint( ValueA ); // 00000000

Tipos Primitivos no Java.





A linguagem Java oferece vários tipos de dados, podemos dividi-los em dois tipos: os tipos primitivos e os tipos de referências. Neste tópico serão abordados os oito tipos primitivos do Java.


byte - tamanho de 8 bits com sinal, significa que pode representar de -128 até 127.

shorttamanho de 16 bits com sinal,  representa valores entre -32.768 até 32.767.

inttamanho de 32 bits com sinal, representa valores entre  -2,147,483,648  até 2,147,483,647.

longtamanho de 64 bits com sinal, representa valores entre -9,223,372,036,854,775,808 até  9,223,372,036,854,775,807.

boolean - somente dois valores possíveis, true ou false.

floattamanho de 32 bits com sinal.

doubletamanho de 64 bits com sinal.

chartamanho de 16 bits sem sinal, representa valores de 0 até 65.535.


Tipos com sinal


Em tipos com sinal, o bit mais a esquerda indica se o número é negativo "1" ou positivo "0".

byte Number = 7;
Representação em binário 00000111

byte Number = -7;
Representação em binário 11111001

Além do bit para indicar o sinal, um número quando representado em negativo, calcula-se o complemento de 2, e soma-se um. Portanto 00000111 após o complemento 11111000, somando 1 fica 11111001.

byte Number = 7;                // 00000111
Number = (byte)~Number;  // 11111000
Number += 1;                     // 11111001

Isto é apenas um exemplo, claro que para transformar um número positivo em negativo, basta multiplicar por menos um (-1).

Se um byte armazena valores entre -128 a 127, como armazenar valores de 0 a 255?
Da mesma forma, a diferença estará na representação do valor, nas conversões para outros tipos de variáveis, e nas comparações.


Apresentado o byte:

byte Number = -7;

this.jTextArea.append( Number + "\n" );                   // -7
this.jTextArea.append( (Number & 0xFF) + "\n" );   //  249


Conversão de byte (0..255) para short:

byte NumberA = (short)249;
short NumberB = (short)(NumberA & 0xFF);


this.jTextArea.append( NumberB + "\n" );   //  249

Neste caso, o que se deseja representar é o valor 249, e não o valor -7.
O que acontece na conversão Number & 0xFF é que a operação binaria ocorre com um byte e um tipo int, e o resultado é um int, portanto ele fica positivo.

byte -7 = 11111001
int FF  = 0000000011111111

O resultado da operação binária 11111001 & 0000000011111111 = 0000000011111001
Ou seja: 0000000011111001

O primeiro bit indica o sinal e ficou com zero (0), o número representado é um inteiro positivo, logo seu valor é 249.


Conparando um byte com um short:

byte NumberA = (byte)249;
short NumberB = 249;


if( NumberA == NumberB ) // Errado
{
   ....
}

Fazer um typecast, também não resolve:

if( (short)(NumberA) == NumberB ) // Errado

O valor de NumberA na verdade é -7, que é diferente de 249, para fazer a comparação correta, use a operação binária:

if( ( NumberA & 0xFF ) == NumberB ) // Certo


Já vi alguns programadores cometerem este engano e reclamarem da linguagem Java, estas operações não são específicas do Java, isto se aplica também para outras linguagens, como C#, C,  e outras. Desta forma, sempre que for comparar variáveis com sinal, e de tamanhos diferentes, as conversões binárias devem ser efetuadas.

Para os demais tipos, short, int, long se aplicam as mesmas regras.

sexta-feira, 4 de maio de 2012

Por que Java?




Os prazos para conclusão dos projetos são curtos, as exigências dos clientes são muitas, e a concorrência não dá trégua. Atualmente muitas soluções são híbridas, precisam rodar no computador, fazer comunicação com um hardware específico, ter acesso disponível via Web, e estar disponível também em equipamentos móveis, como celulares.

É inviável desenvolver um projeto utilizando muitas soluções, imaginem um projeto com alguns módulos desenvolvidos em C, outros desenvolvidos em C#, PHP, e as aplicações do celular desenvolvidas em Java. Utilizamos quatro linguagens diferentes para construir uma solução, precisamos de uma equipe com conhecimento variado, e em caso de desfalque de um membro da equipe, nem sempre é possível realocar, pois o recurso disponível pode não ter conhecimento na linguagem desejada.

Sempre que possível optamos por utilizar uma única linguagem, mas são poucas as que nos permitem ter tanta flexibilidade como o Java. Com o Java podemos desenvolver aplicações para várias plataformas, Windows, Linux, FreeBSD, Mac etc. A aplicação pode ser Web ou Desktop, ou ambas, utilizando o Webstart ou o Applet. Inicialmente o Applet era pesado e lento, o que não acontece mais nos dias de hoje devido ao poder de processamento das máquinas. É possível também desenvolver uma aplicação Web com cara de Desktop sem ter a preocupação com as incompatibilidades dos navegadores. Todas as opções de interfaces disponíveis para aplicação Desktop como o Swing e o Awt estão disponíveis para serem utilizadas no Applet.


Já desenvolvi um Applet para comunicação com hardware específico, trabalhando tanto com a RS232 e USB. A comunicação entre o PC e o hardware funciona muito bem, e no tempo esperado. Esta solução resolveu um problema de uma aplicação que é Web, e precisava comunicar-se com periféricos utilizando um navegador. A vantagem do uso de Applets, é que o desenvolvedor não fica limitado a alguns navegadores e sistemas operacionais, como é o caso do uso do ActiveX.

Uma das vantagens de desenvolver em Java, é que o desenvolvedor consegue atingir várias plataformas e Hardwares diferentes. Uma rotina escrita para calcular um CRC por exemplo, pode ser reutilizada numa aplicação Desktop, numa aplicação Web, num Celular e até mesmo numa aplicação específica escrita para rodar num determinado processador. Java não tem limites, não é difícil entender o motivo que levou a Google escolher o Java como linguagem para o Android.




Programo também em C, C++, C#, Object Pascal(Delphi). Já trabalhei em vários projetos, posso dizer que cada caso é um caso, e muitas vezes dependendo do projeto você não pode utilizar sua linguagem preferida. O meu objetivo não é falar bem ou mal desta ou daquela linguagem de programação, mas sim, esclarecer que projetos são diferentes, e muitas vezes precisam de uma solução diferente. Ao mesmo tempo tenha cuidado para não diversificar demais, e criar uma babilônia de linguagens diferentes, onde ninguém mais se entende.



O Java para algumas coisas depende de outras linguagens que possam gerar código nativo. Sempre que necessário eu utilizo C para fazer a interface entre o Java e o Sistema Operacional. O Java oferece uma forma simples para permitir que o programa comunique-se com o meio externo, utilizando o JNI, Java Native Interface. No Windows você pode criar uma DLL (Dynamic Link Library), no Linux você cria uma SO (Shared Object), sempre dentro do formato JNI.

É possível também compilar o java para código nativo, o GCJ pode ser utilizado para compilar o Java. Já fiz alguns testes que funcionaram perfeitamente, mas nunca precisei utiliza-lo pois o Java de forma "interpretada" sempre atendeu bem aos meus requisitos. Acredito que se você precisa compilar o Java para código nativo, em algum momento no seu projeto você tomou a decisão errada, ou então não está sabendo como resolver o problema. Neste caso sugiro dar uma olhada no JNI, como já mencionei acima.



A Microsoft tentou criar seu próprio Java, mas não conseguiu ir muito longe e desistiu. Para tentar concorrer com o Java da Sun a Microsoft criou a plataforma .NET, que, aliás,  atualmente estou utilizando com a linguagem C#. O que posso dizer sobre a linguagem C#, é que é uma linguagem simples e com boa curva de aprendizado, sua sintaxe é parecida com o Java e C. Já a plataforma, deixa muito a desejar, agora por exemplo saiu a versão 4 do .NET, e acredite se quiser, programas compilados para versões menores não rodam na versão 4, e programas compilados para a versão 4 não rodam em versões anteriores. Se alguém descobriu alguma forma de compatibilizar sem precisar recompilar, por favor, me avisem.




O objetivo aqui é esclarecer e chamar a atenção dos desenvolvedores, gerentes e diretores, para não entrarem na conversa de fanfarrões e novatos quando for decidir qual tecnologia utilizar para desenvolver as soluções, prestem muita atenção no que tem no mercado, suas vantagens e desvantagens, e não saiam desenvolvendo simplesmente poque algumas pessoas tem preferência por esta ou aquela tecnologia. Este alerta é principalmente para a diretoria, depois de tomar a decisão errada, não adianta dizer que a concorrência desenvolveu um produto similar, em menos tempo e menos recursos.


Para não dizerem que estou do lado do Java, "fica a dica", se a sua solução roda somente em Windows, e não existe possibilidade futura de ser necessário usar em outras plataformas, utilize .NET com a linguagem C#, neste caso, na minha opinião é sem dúvida a melhor solução. Porém, se você pensou em multiplataforma, esqueça .NET/Mono, você e sua equipe terão muito trabalho e pouco retorno, neste caso sim, recomendo Java, e claro, caso seja uma aplicação que requeira muito processamento gráfico, não tem saída, o jeito é usar C ou C++.

Boa sorte!!!

Verifique a classificação das linguagens mais usadas.