Como burlar ou resolver o erro de code too large?

Boa tarde, tenho um Freme com nome “Mesas” nele para cada mesa eu tenho um “menu” gráfico onde mostro o tempo de permanência, valor parcial da conta e o garçom que esta atendendo a mesa. Nesta tela tinha 20 mesas e rodava o método de boa, hoje acrescentei mais 40, porém o NetBeans me retornou um erro de ‘code too large’ deu uma olhada em fóruns e vi que o valor máximo de um método seria de 64kb e passei esse limite, Vi também em outro fórum que o erro foi dado por ter muitas informações no método InitComponents, teria alguma forma de eu “dividir” este método? se não, como faço para contornar este erro? Por eu ter optado por colocar muitas informações nesta tela ela atualmente tem cerca de 10 mil linhas.

Zeus do céu, quantas linhas tem esse método? :o O meu avatar nunca expressou tão bem a minha expressão atual.

Não dá pra postar aqui pra vermos como dividir?

(acabei excluindo a resposta anterior, sem querer)

Boa tarde confuso, estou pensando justamente em dividir o método, mas de método mesmo eu devo ter entre 2 a 3 mil linhas. O meu problema está sendo justamente o método initComponents acredito que nele deva ter umas 7 mil linhas isso que está consumindo o espaço inteiro. Até posso postar, mas é muita linha mesmo rs. Vai querer que eu poste?

Tem alguma forma de dividir o InitComponentes?

Eu não trabalho com Swing e JavaFX então não sei se é uma prática comum ter métodos tão grandes, mas eu duvido muito que um único método realmente precise ser tão colossal assim, haha. Praticamente a aplicação inteira fica nesses métodos?

Não dá pra simplesmente pegar trechos de código do método grande e colocar num novo método? Se tem tantas linhas com certeza deve ser trechos que dê pra isolar. Por exemplo:

public void meuMetodoGrande() {
   ..... muitas linhas de código aqui ...

   int a = pedeUmValorProUsuario();
   int b = pedeUmValorProUsuario();
   int soma = a + b;
   System.out.println("Oi, a soma é: " + soma);

   ..... muitas linhas de código aqui ...
}

Como o resto do método meuMetodoGrande não depende dessas quatro linhas inteiras, apenas do soma, então dá pra extrair num método isolado:

public void meuMetodoGrande() {
   ..... muitas linhas de código aqui .....

   System.out.println("Oi, a soma é: " + computarUmaSoma());

   ..... muitas linhas de código aqui .....
}

public int computarUmaSoma() {
   int a = pedeUmValorProUsuario();
   int b = pedeUmValorProUsuario();
   return a + b;
}

Aí, você aumentou um pouco a quantidade de linhas total do projeto, mas diminiu bastante a quantidade de linhas de um único método. É isso? Não sei se é isso que você tá querendo.

Até dá para eu fazer isso, se eu pegar os métodos que criei pra os contadores, para pegar as variáveis do banco de dados e os botões realmente dá para enxugar umas 2 a 3 mil linhas, porém meu método initComponents tem exatas 7.736 linhas de código e eu acredito que mesmo enxugando o resto essa quantidade de linhas já estoura os 64kb disponíveis. Fora que eu ainda não acabei 100% a tela falta fazer as conexões dessas novas mesas acredito que vai mais umas 3 a 4 mil linhas de código para fazer as conexões restantes. Eu posso ate fazer essas linhas em outras classes, mas acredito que para resolver o problema eu teria que encurtar o método initcomponents. Então queria saber se não poderia quebrar o initcomponents em diversos métodos e chama-los respectivamente?

O initComponent é um método Java como qualquer outro, certo? Então, dá pra quebrar em diversos métodos, sim, talvez até em outras classes. A boa prática é que cada método ou classe seja responsável apenas por uma única função/tarefa, então essas novas linhas que você precisa acrescentar provavelmente seria legal serem criados em outros métodos e classes.

O initComponents é o método que o próprio NetBeans cria para fazer a parte gráfica (para você não precisar escrever e dimensionar cada componente gráfico ajuda bastante) porém eu não tenho acesso a fazer nenhum tipo de alteração nesse método ele é bloqueado por default. Pelo que sei ate dá para mexer nele usando o “personalizar código” agora levar ele para outra lugar como se fosse outra classe, parecido com o CSS no HTML eu não sei se é possível fazer algo assim e é ai que está o meu problema.

porém eu não tenho acesso a fazer nenhum tipo de alteração nesse método ele é bloqueado por default

Aaaah, agora entendi o problema. Desculpa, não tenho muito conhecimento de desenvolvimento GUI com Java, mas encontrei esse tópico que talvez seja sobre o mesmo problema por qual você tá passando: Code too large - NetBeans

Pois é, eu já vi esse tópico que você me mandou. Mesmo assim muito obrigado meu amigo.

Independente de causar esse erro de “Code Too Large”, ter métodos com muitas linhas não é uma boa, porque dificulta e muito a manutenção. Como o initComponents() é gerado automaticamente pelo Netbeans, talvez você não tenha sentido essa dificuldade, mas pode te causar outros problemas, além desse erro que está tendo agora.

Pelo que entendi, você criou 60 componentes de alguns tipos (eu suponho que sejam JPanels e JLabels com os dados da mesa). A minha recomendação é refatorar esse código, criando uma classe para armazenar os dados da mesa. Visualmente, você pode estender um JPanel, criando uma classe JPanelMesa por exemplo, e usar instâncias dessa classe para representar cada mesa.

Em cima disso, algo que pode ajudar é criar as instâncias em tempo de execução. Assim, sua janela inicialmente não terá nenhuma mesa, e seu initComponents() deve ter poucas linhas. Quando chega um cliente, você adiciona uma mesa, criando-a em tempo de execução. Acho que dá pra entender a ideia.

Sim, provavelmente vai dar bastante trabalho e levar um tempo, mas acredito que mais cedo ou mais tarde você precisará fazer algo parecido, melhor começar o quanto antes.

Abraço.

TerraSkilll sua ideia foi realmente muito boa não tinha parado pra pensar dessa forma, o problema é que tenho uma urgência para fazer isso e dessa forma que você me aconselhou não daria tempo. Mesmo assim vou migrar para essa forma só tenho que abstrair melhor ela rs. Outra ideia que estava pensando aqui é o seguinte, queria criar diversas classes, uma receberia o método initcomponents e outra o comando de botões e outra as interações do banco de dados. Depois queria chamar todas dentro de outra classe na ordem certa, como se tivesse desenhando um JFrame seus componentes e seus métodos. Não sei se dá certo nem sei se você conseguiu entender, mas eu acho que vou tentar assim, caso não consigo eu vou ter que recorrer ao seu que é mais demorado já que terei que fazer do zero.

Só para constar tentei e não deu certo.

É uma boa prática um método não ter mais do que 20~30 linhas, tem que ser algo claro e objetivo onde você põe o olho e entende o que está acontecendo.

Pelo que você está falando, aparentemente você está implementando todas as telas de seu sistema na mesma classe, não faz isso, cria uma classe por tela, ou mais classes caso as telas sejam complexas.

Nossa, e’ um metodo com muitas linhas heim !.

Pensa em dividir, telas separadas do processamento e mesmo o processamento em classes distintas.

A manutenção deverá ficar melhor.

Você realmente precisa dar uma estudada em boas práticas…

1 curtida

Bom dia Staroski, o erro é no método initcomponents este método é criado pelo sistema eu não tenho controle sobre ele. Ele é responsável por escrever a parte gráfica do jframe, então um jpanel com alguns labels e buttons já dá umas 200 linhas fácil. O TerraSkilll disse exatamente o que aconteceu. Eu tenho uma frame com 60 jpanels dentro desses jpanels eu tenho labels, buttons e outros componentes, então dá para imaginar o porque dessa tela estar com tantas linhas.

Sobre ter boas práticas de programação eu sempre tento usar. Meus métodos criados por mim nunca ultrapassam 40 linhas. Agora esse bendito initcomponents não é um método gerado por mim.

Cada um desses JPanel deveria ser uma classe independente, aí seu initComponents só terá as 60 instanciações, se é que elas realmente precisam ser instanciadas no initComponents