Preciso usar uma linguagem nova. É possível usar Java?

31 respostas
C

Olá, estou vivendo uma situação no mínimo perturbadora. Tenho que optar por uma nova linguagem para o desenvolvimento de um novo produto e não sei pra onde ir, já que hoje são tantas as opções, estou inseguro com a possibilidade de fazer uma opção errada.

O contexto é o seguinte: Meu produto tem que rodar em redes locais com acesso a banco de dados, com buscas e relatórios. Mas existe a possibilidade de precisar ser multiplataforma, ou seja, estão aparecendo clientes que querem usá-lo no Windows e outros no Linux… ( por enquanto ).

A minha pergunta é: Java pode ser a linguagem para resolver essa situação? Ou posso usar outra opção, já que andei lendo que o Java não é a melhor indicação para aplicações desktop.

Aguardo algum auxilio dos amigos

Carlos Rosa

31 Respostas

dedspr

Olá carcarlosrosa

O java pode não ser a melhor opção em aplicações desktop… mas nos outros quesitos ela se destaca, irá rodar em ambiente windows/linux só tendo a JVM… e também para relatório você poderá usar o ireport que é muito bom… eu aconselho você a usar java…

Rodrigo_Rocha_de_Mor

Você disse a palavra chave quanto à vantagem de JAVA:

Multiplataforma!

Quanto a essa história de Java não ser a melhor opção para Desktop, se comparada a outras tecnologias que possuem maiores facilidades na hora do desenvolvimento, creio que perde apenas na produtividade, mas não na qualidade.

[]'s

sigma

Depende como e a complexibilidade do seu front-end.

Swing não e muito produtivo, mas vc fica tranquilo na questão multi-plataforma.

dedspr

Eu mesmo confesso pra você que fiquei boquiaberto quando fiz uma aplicação que rodava no windows e um cliente pediu se rodava no linux eu fui fazer o teste e rodou normal… sem problema nenhum…

Não vou falar que roda no mac porq nunca testei mas tbm deve rodar normal…

C

dedspr:
Eu mesmo confesso pra você que fiquei boquiaberto quando fiz uma aplicação que rodava no windows e um cliente pediu se rodava no linux eu fui fazer o teste e rodou normal… sem problema nenhum…

Não vou falar que roda no mac porq nunca testei mas tbm deve rodar normal…

Então, a dificuldade fica por conta da produtividade, é isso?!? Existe algum projeto para que a produtividade também seja um ponto positivo?

E em relação a sua aplicação, dedspr, é uma aplicação desktop ou web?

[]s

paulofafism

Boa tarde

Java para aplicações desktop e muito bom. Ele só não e produtivo no inicio do desenvolvimento quando não se tem nada pronto, codigos entre outras cosas. Depois que você ja tem tudo pronto. Fica muito mas facil desenvolver qualquer aplicação desktop. Atualmente estou desenvolvendo um solução ERP usando Swing.

sigma

Eu fiz um programa Swing usando webstart, e rodou tanto no linux quando no windows normalmente.

Carlos vc tem que ver o escopo do sistema. se e principalmente bat ou interface com cliente.

O NetBeans parece que e a ferramenta que mais ajuda para aplicações Swing, vale dar uma olhada.

sigma

paulofafism concordo com sua afirmação, mas a maioria dos sistema tem seu alto custo de desenvolvimento no inicio (sistema bem feito).

sjoaquim

Não acho que Swing seja improdutivo! Acredito que se você utilizar a ferramenta adequada (por exemplo, o NetBeans, que é capaz de fazer o layout da janela, além de ser uma excelente IDE), se torna tão fácil quando desenvolver no VisualStudio…

fantomas

Eu indicaria Java porque eu tenho certeza absoluta que vai funcionar mesmo dando um pouco de trabalho, mas essa sua situação me faz pensar nas seguintes perguntas:

Vc já pensou na curva de aprendizado? Porque Java não se aprende de uma hora para outra, logo tem que ponderar muito bem essa questão.

Vc acha que seus conhecimentos atuais podem ajudar a diminuir a curva de aprendizado?

Fora a linguagem Java e que possa lhe trazer um certa produtividade em projetos Desktop multiplataforma acho que são a Kylix (tem que pagar), Lazarus e talvez C++.

P.S. Kylix e Lazurus é o Object Pascal

C

Muito esclarecedor esse nosso bate-papo. Estou concluindo que o caminha é mesmo o deenvolvimento através da linguagem Java, com a aplicação da IDE NetBeans, os relatórios do ireport.

E em relação ao banco de dados? Qual é a maioria?

[ ]s

C

fantomas:
Eu indicaria Java porque eu tenho certeza absoluta que vai funcionar mesmo dando um pouco de trabalho, mas essa sua situação me faz pensar nas seguintes perguntas:

Vc já pensou na curva de aprendizado? Porque Java não se aprende de uma hora para outra, logo tem que ponderar muito bem essa questão.

Vc acha que seus conhecimentos atuais podem ajudar a diminuir a curva de aprendizado?

Fora a linguagem Java e que possa lhe trazer um certa produtividade em projetos Desktop multiplataforma acho que são a Kylix (tem que pagar), Lazarus e talvez C++.

P.S. Kylix e Lazurus é o Object Pascal

Pois é, sou programador Delphi e preciso criar esse novo produto em uma tecnologia que permita a multiplataforma, se for pra ser o Java precisarei aprender além da sintaxe, também consolidar os conhecimentos de Orientação a Objetos. Mas estou criando a certeza de que vai ser bom pagar esse custo inicial.

Rodrigo_Rocha_de_Mor

Não é apenas em relação ao desenho de um formulário…

Mas em sincronização de componentes com tabelas e outras coisas mais, que como alguns sabem, com algumas ferramentas basta vc ir “ligando” as coisas para que funcione da forma esperada…
Mas sei que a coisa está mudando, temos ótimas funcionalidades para serem usadas em aplicações Desktop, como os Bens Binding (JSR 295)!
Sem contar que a IDE NetBeans 6.x está excelente para projetos Desktop!
Com suporte à todas essas novidades! Inclusive com exemplos de uso!

Quanto ao Mac, que foi citado acima, a resposta é sim! Também possui sua versão da JVM!

[]'s

paulofafism

Bem no inicio do meu desenvolvimento com aplicações Java Desktop levei muita coça pois coisas que fazia facilmente no delphi leva tempo para fazer no Java. Mas hoje esta um mar de rosas hehehehee. Por enquanto…

sjoaquim

Se for possível pra você aprender, com certeza eu recomendo Java! :slight_smile:

Banco de dados… bem, antes de mais nada, recomendo fazer sua aplicação também independente do SGBD a ser utilizado, já que o requisito é portabilidade. Se o acesso ao banco não for muito complexo, aprenda como funciona o JDBC e utilize com o seu SGBD favorito (Oracle, MySQL, PostgreSQL etc.). Se for complexo, vale a pena dar uma fuçada no Hibernate. Mas já aviso que o Hibernate é bastante complexo de se aprender, visto que é cheio de configurações, mapeamentos etc.

Rodrigo_Rocha_de_Mor

Agora em questão ao SGBD

Eu sou PostgreSQL 8.x!

Robusto e confiável!

[]'s

paulofafism

Eu uso Netbeans para soluções desktop, mas peloas testes que fiz ate hoje com a solução de binding com Netbeans, o beans binding tem problemas quando faço binding por exemplo com JTable quando uso TableModel externo ou seja que seja desenvolvido. Ele simplesmente não aceita pois ele usa o beans binding usa outra implementação de TableModel. Ai no inicio optei pelo genesis que por sinal e superior ao beans binding na minha opinião, mas infelizmente também tem suas desvantagens. Mas nem tudo e perfeito. E com isso desenvolvi um solução propria de binding para situações que não tinham nesses frameworks Genesis ou Beans binding.
E isso ai

T

Essa sua aplicacao tem que rodar obrigatoriamente em ambiente desktop? se puder rodar em ambiente web seu leque de opções é muito maior, com Ruby on Rails, Java, .Net, Php… quanto a produtividade ao desenvolver ambientes desktop em java… usando o netbeans com o matisse, não acho que perde em nada para o .net (em produtividade, apenas para deixar claro! hehehe).

T

esqueci de dizer… quanto ao banco de dados, se for ficar no cliente, eu usaria o Oracle XE, se for deixar em ambiente web, hospedado em algum lugar, eu optaria por PostgreSQL, é muito mais barato, a menos que voce resolva aprender junto hibernate… ai o banco passa a nao ser mais um problema…

mister_m

paulofafism:
… Ai no inicio optei pelo genesis que por sinal e superior ao beans binding na minha opinião, mas infelizmente também tem suas desvantagens. Mas nem tudo e perfeito. E com isso desenvolvi um solução propria de binding para situações que não tinham nesses frameworks Genesis ou Beans binding…

Olá Paulo,

Você poderia comentar quais funcionalidades desagradaram você ou não faziam parte do genesis? O genesis é um projeto open-source, então, ao invés de você desenvolver sua solução externa, você poderia contribuir para a sua evolução. Gostaria de saber mais a respeito dessas suas necessidades e como você as atendeu.

C

sjoaquim:
Se for possível pra você aprender, com certeza eu recomendo Java! :slight_smile:

Banco de dados… bem, antes de mais nada, recomendo fazer sua aplicação também independente do SGBD a ser utilizado, já que o requisito é portabilidade. Se o acesso ao banco não for muito complexo, aprenda como funciona o JDBC e utilize com o seu SGBD favorito (Oracle, MySQL, PostgreSQL etc.). Se for complexo, vale a pena dar uma fuçada no Hibernate. Mas já aviso que o Hibernate é bastante complexo de se aprender, visto que é cheio de configurações, mapeamentos etc.

Muito boa a possibilidade de independencia de banco de dados, nesse caso se for usar JDBC os comandos para o banco são dados pela sua aplicação e no caso do Hibernate fica por conta dele? É isso?

[ ]s

paulofafism

Ola Michael.

Bem as soluções foram as seguintes

1 - Binding com ComboBox e JRadioButtons.
Combo box. Na documentação do genesis o binding e feito usando Enuns para identificador os valores do combox.
https://genesis.dev.java.net/nonav/3.1/maven-site/pt-BR/binding_toggle_buttons.html
Ao inves de Enuns precisei linkar cada valor do Combox com um objeto

Ex: um combox que lista para situações de tipo de documento financeiro

Tenho em meu banco de dados a Tabela SITUACAO que armazena situações de tipo de tipo de documento
Ex. Documentos Pagos, Aberto, Cancelado etc.

E outra tabela chamada DOCUMENTO relacionamento com a tabela SITUACAO.

E minha classe documento fica assim

public class  Documento{

      ....Outros atributos da classe....

       private Situacao situacao;
   
     public Documento(){}
     

     public void setSituacao(Situacao situacao){this.situacao = situacao}  

     public Situacao getSituacao(){return situacao}

}

Ao inves relacionar os itens do combox com Enum precisei relacionar com objetos.

2 - Problema
A forma como o genesis separa a logica da interface:

As action ficam na classe de persistência

@Form
public class LoginForm {
   private String usuario;
   private String senha;

   public String getUsuario() {
      return usuario;
   }

   public void setUsuario(String usuario) {
      this.usuario = usuario;
   }

   public String getSenha() {
      return senha;
   }

   public void setSenha(String senha) {
      this.senha = senha;
   }

   @Action
   public void login() {
      System.out.println(usuario);
      System.out.println(senha);
   }

   @Action
   public void limpar() {
      setUsuario(null);
      setSenha(null);
   }
}

Forma como implementei. Onde posso ter mais de uma classe Controller
Razao para ter mais de uma classe Controller
1 - Um classe controller com operações padrões para todos os formularios
2 - O genesis não me permite usar dois classes que usam a anotação @Form

Implementei também binding de acções do teclado
Veja o codigo abaixo

public class LoginForm {
   private String usuario;
   private String senha;

   public String getUsuario() {
      return usuario;
   }

   public void setUsuario(String usuario) {
      this.usuario = usuario;
   }

   public String getSenha() {
      return senha;
   }

   public void setSenha(String senha) {
      this.senha = senha;
   } 
}

@Controller //Anotação criada para o meu framework
public class ControllerLogin{
  @Action
   public void login() {
      System.out.println(usuario);
      System.out.println(senha);
   }

   @Action
   public void limpar() {
      setUsuario(null);
      setSenha(null);
   }

}

//Usando binding para ações do teclado
@Controller //Anotação criada para o meu framework
public class ControllerLoginKeyEvent{

   @KeyAction(action=KeyEvent.VK_F5) //Usando dessa forma e executa pelo formulario
   public void login() {
      System.out.println(usuario);
      System.out.println(senha);
   }

   @KeyAction(action=KeyEvent.VK_F6)
   public void limpar() {
      setUsuario(null);
      setSenha(null);
   }

   @KeyAction(action=KeyEvent.VK_F2, component = "txtCodigoUsuario") //usando dessa forma e para o componente da GUI
   public void consultar() {
      setUsuario(null);
      setSenha(null);
   }


}

Nos poderiamos unir nossas ideias. Esse Framework que estou desenvolvendo estou fazendo para meu TCC da pos graduação. Inclusive já estou usando o framework em um projeto particular

podemos conversar por email: [email removido]

O

Olá Carlos, pra já ir botando a mão na massa, recomendo a leitura das excelentes apostilas de java OO (FJ-11) e java web (FJ-21) da caelum:

C

ozix:
Olá Carlos, pra já ir botando a mão na massa, recomendo a leitura das excelentes apostilas de java OO (FJ-11) e java web (FJ-21) da caelum:
http://blog.caelum.com.br/apostilas/

Obrigado a todos pelas dicas, penso que com isso que discutimos posso sim “colocar a mão na massa” - é isso ai ozix - e começar a desenvolver a minha aplicação com o Java. Valeu.

[ ]s

:slight_smile:

luistiagos

cara se eu fosse vc usava brainfuck ou whitespace…
isto é o que a em termo de linguagens… :stuck_out_tongue:

hmichel

Isto é algo possível no genesis. Para exemplos de combobox, veja https://genesis.dev.java.net/nonav/3.1/maven-site/pt-BR/populating_with_dataproviders.html#SwingComboBox
Basta que seus objetos respeitem as regras de equals para que tudo funcione corretamente.

Até onde eu entendo de tudo que você citou, o genesis suporta a bastante tempo. Para o que você quer basta utilizar-se de polimorfismo. Você pode ter seus forms estendendo seus mapeamentos de persistência ou mesmo, se for o caso, ter forms bases para suas GUIs, e fazer especializações conforme necessário. Quando você sobrescreve um método anotado, o genesis entende e funciona adequadamente nestes cenários.

Realmente este tipo de recurso o genesis não possui. Existe uma issue para o genesis, https://genesis.dev.java.net/issues/show_bug.cgi?id=365, a qual deverá tratar também teclas de atalho.

O mesmo para o projeto genesis. Fique a vontade de expressar suas opiniões, sugestões e críticas em nossa lista de discussões.

[]'s

C

luistiagos:
cara se eu fosse vc usava brainfuck ou whitespace…
isto é o que a em termo de linguagens… :-P

Bom dia, luistiagos, você já tem algum trabalho desenvolvido nessad linguagens?

paulofafism
Isto é algo possível no genesis. Para exemplos de combobox, veja https://genesis.dev.java.net/nonav/3.1/maven-site/...taproviders.html#SwingComboBox
Basta que seus objetos respeitem as regras de equals para que tudo funcione corretamente.

Ops que a falta de uma boa leitura não faz. hehheeeee

Antes de mais nada quero pedir desculpas em relação a isso. Como não estava conseguindo fazer algumas coisas acabei desenvolvendo algo proprio em relação a binding. Até que valei a pena aprendi bastante de como criar um framework de binding. e como eu disse estou fazendo o tema do meu TCC em cima deste projeto.
Esta e a forma como faço o binding com Lista, JComBox, e RadioButtons

ListValues values = new DefaultListValues();        
        //Adicinando os valores da lista que pode ser de qualquer tipo um mesmo um Bean      
        //Onde adiciono o valor que será exibido na lista e o respectivo valor dessa lista
        values.add("Ativo", 0);  
        values.add("Inativo", 1);
        values.setDefaultValue(0);
Em relação a isto
paulofafism wrote:
    2 - Problema
    A forma como o genesis separa a logica da interface:
    As action ficam na classe de persistência
    ...
    Forma como implementei. Onde posso ter mais de uma classe Controller
    Razao para ter mais de uma classe Controller
    1 - Um classe controller com operações padrões para todos os formularios
    2 - O genesis não me permite usar dois classes que usam a anotação @Form

    ...



Até onde eu entendo de tudo que você citou, o genesis suporta a bastante tempo. Para o que você quer basta utilizar-se de polimorfismo. Você pode ter seus forms estendendo seus mapeamentos de persistência ou mesmo, se for o caso, ter forms bases para suas GUIs, e fazer especializações conforme necessário. Quando você sobrescreve um método anotado, o genesis entende e funciona adequadamente nestes cenários.
Agora em quando a este cenário ate que poderia fazer usando polimorfismo mas neste caso como coloquei como Exemplo. Eu NÃO gostaria que meu bean de persistência ficasse dessa forma:
@Form  
   public class LoginForm {  
     private String usuario;  
       private String senha;  
      
       public String getUsuario() {  
          return usuario;  
       }  
      
      public void setUsuario(String usuario) {  
         this.usuario = usuario;  
      }  
     
      public String getSenha() {  
         return senha;  
      }  
     
      public void setSenha(String senha) {  
         this.senha = senha;  
      }  
     
      @Action  
      public void login() {  
         System.out.println(usuario);  
         System.out.println(senha);  
      }  
     
      @Action  
      public void limpar() {  
         setUsuario(null);  
         setSenha(null);  
      }  
 }
Mas sim dessa . Onde as actions e outros eventos seriam tratados em classes diferentes. Isso e possivel?
@Form  
   public class ControllerLoginForm {  
      @Action  
      public void login() {  
         System.out.println(usuario);  
         System.out.println(senha);  
      }  
     
      @Action  
      public void limpar() {  
         setUsuario(null);  
         setSenha(null);  
      }  
 }
A

carlosrosa:
luistiagos:
cara se eu fosse vc usava brainfuck ou whitespace…
isto é o que a em termo de linguagens… :-P

Bom dia, luistiagos, você já tem algum trabalho desenvolvido nessad linguagens?

Opa, carlos, bão?
[editado - ortografia]

O luistiagos tava sendo irônico… as duas linguagens que ele citou são linguagem não comerciais, obras-primas de entusiastas de computação…

Agora… analise bem a questão das licenças, principalemente no SGBD… estou no meio de um projeto de migração de SGBDs porque a licença não foi observada no início do mesmo…

Abraço.

hmichel

Dúvida cruel, de onde vem as propriedades usuario e senha?
Se eu entendi bem, você pode fazer algo como:

@Form  
   public class ControllerLoginForm extends [b]SeuBeanPersistente[/b]{  
      @Action  
      public void login() {  
         System.out.println(usuario);  
         System.out.println(senha);  
      }  
     
      @Action  
      public void limpar() {  
         setUsuario(null);  
         setSenha(null);  
      }  
 }

sendo usuario e senha propriedades de SeuBeansPersistente. E para transferir na rede por exemplo, chamar um command ou algo do gênero, use o PropertyUtils.copyProperties da Apache.
Assim você tem os dois estados separados, o de persistência e o da tela em si. Isso funciona bem também na hora de popular a view com dados provenientes de uma consulta por exemplo.

[]'s

paulofafism

sendo usuario e senha propriedades de SeuBeansPersistente. E para transferir na rede por exemplo, chamar um command ou algo do gênero, use o PropertyUtils.copyProperties da Apache.
Assim você tem os dois estados separados, o de persistência e o da tela em si. Isso funciona bem também na hora de popular a view com dados provenientes de uma consulta por exemplo.

Poderia se fazer como desenvolvi no me framework
Existem duas formas

Onde a anotação diria que o bean seria um entidade

//Usando a propria anotação no pacote javax.persistente
 @Entity    
  public class MeuBeanPesistente{ 
    ......
  }

E a logica separada

@Form    
   public class ControllerLoginForm {    
      @Action    
      public void login() {    
         System.out.println(usuario);    
         System.out.println(senha);    
      }    
       
      @Action    
      public void limpar() {    
         setUsuario(null);    
         setSenha(null);    
      }    
 }

ou da forma como implmentei no meu framework para vincular as propriedade dos beans com os componentes da GUI

//Lista de valores para comboBox
        ListValues values = new DefaultListValues();        
        values.add("Ativo", 0);        
        values.add("Inativo", 1);
        values.setDefaultValue(0);
        
        bind = new DefaultBindController(this.toString(), frm, this);
        KeyActionsForm key = new KeyActionsForm(this);        
        ((DefaultBindController)bind).registerBindings("Key", key);                                
        ViewModel view = bind.getViewModel();        
        
        binding  = new DefaultBinding(view);        
        binding.setDataSource(frm.getBeanEntity());
        binding.binding(frm.getTxtCodigo(), "codigo", "text");
        binding.binding(frm.getTxtNome(), "nome", "text");                        
        binding.binding(frm.getCBStatus(), "status", values);
Criado 22 de agosto de 2008
Ultima resposta 25 de ago. de 2008
Respostas 31
Participantes 13