public class Desafio {
public static void main(String[] args) {
String nome=“System.out.println”;
nome(“Olá Mundo”);
}
}
// Está dando vários erros
//quero substituir Syste.out.println por nome
//nome =System.out.println
//testei várias combinações e não funciona
//Onde foi que eu errei?
Eu acho a vc pode criar um lambda para isso
Olá peczenyj
Sou iniciante em Java, como ficaria o código completo?
Quero gastar o mínimo de linhas possível para escrever o código.
Valeu pela atenção.
Não é costume da galera do GUJ te dar o código completo de qualquer coisa. Você já sabe o que deve fazer, então, aprenda a fazer.
Pense no seguinte ditado: “De o peixe a um homem e você matará a fome dele por um dia. Ensine o homem a pescar e você matará a fome dele por toda vida.”
Até onde sei, a solução mais próxima do que vc quer, seria criar criar um método chamado nome
que, internamente, invoca o System.out.println
.
public static void nome(String mensagem) {
System.out.println(mensagem);
}
Talvez eu não tenha entendido direito seu objetivo, se for o caso, vc poderia dar mais detalhes sobre o que quer.
Olá widomiciano
Acho que ainda não é resposta que estou procurando, vou detalhar pra você o teste que eu quero fazer, talvez você possa me ajudar.
Quando a gente escreve Olá Mundo na tela não faz muita diferença o tamanho do arquivo. Se você fizer um código grande, várias vezes vai repetir esse System.out.println, são 18 caracteres para cada saída na tela, se eu conseguir fazer um nome qualquer ou letra qualquer receber estes 18 caracteres vou poder reduzir o tamanho do código, basta eu armazenar dentro de uma letra todas as 18, ou seja, cada vez que eu for escrever System.out.printl, escreverei apenas uma letra e ganharei 17 caracteres no tamanho de um arquivo final multiplicado por cada vez que eu for imprimir na tela qualquer coisa. System.out.println é uma coisa que sempre escrevemos na tela, imagina como posso reduzir o código. Quero eliminar o System.out.println. Um jogo de vídeo game tem aí uns 80 gigas, precisamos descobrir um jeito de diminuir isto. Memória ram tem que ter muita pra poder rodar as coisas.l
O mais perto que você vai conseguir chegar disso em Java é assim:
@FunctionalInterface
interface Printer {
void print (String s);
}
public class Main {
public static void main (String[] args) {
Printer p = System.out::println;
p.print("Oi");
}
}
O método println
da classe PrintStream
(que é o tipo de System.out
) é sobrecarregado e tem várias assinaturas. Pra conseguir atribuir uma referência pra uma dessas assinaturas, você precisa de uma interface funcional onde o método tenha a mesma assinatura do que você quer capturar.
Ao contrário do que acontece em linguagens como JavaScript, por exemplo, funções em Java não são objetos de primeira classe. Você consegue simular alguma coisa com lambdas do Java 8 (como fiz no exemplo), mas é só um atalho para criação de interfaces.
Se você precisa que as funções sejam realmente tratadas como objetos, Java não vai te atender. Outras linguagens como Python, Clojure, JavaScript, PHP, Perl, etc. com essa funcionalidade vão te servir melhor.
@FunctionalInterface
interface Printer {
void print (String s);
}
public class Main {
public static void main (String[] args) {
Printer p = System.out::println;
p.print(“Oi”);
p.print(“Obrigado, resolveu!”);
}
}
Entendi sua preocupação com o tamanho do código fonte, mas será que importa?
Quando vc distribui seu jogo de 80GB, está distribuindo apenas o binário. O tamanho do seu código fonte não é relevante depois de compilado.
Você pode fazer um static import java.lang.System.out.println
, aí é só chamar o método println
sem precisar usar o caminho completo.
Mas acredite, não vão ser chamadas de métodos que vão tornar seu jogo grande.
As chamadas de método após compiladas vão ser convertidas em desvios para a área de código do seu método.
Quando você estudar linguagens formais e compiladores, vai ficar mais claro de entender o que acontece.
O que é bem irrelevante em muitos casos.
A menos que vc queria desenhar uma DSL ( domain specific languagem ), vc escrever o minimo possivel ou não não traz vantagem alguma.
Java possui JIT ( Just in time ) Optimization. Isso significa que a maquina virtual java analisa o proprio codigo e otimiza as partes que são executadas “com mais frequencia”, criando codigo nativo.
O menor codigo fonte possivel é basicamente inutil. Contudo se vc tem serias restrições de memoria então existem tecnicas especiais que vc pode tentar utilizar porém eu, pessoalmente, não acho que nesse cenário Java seria a melhor opção.
Olá wldomiciano,
Num jogo de 80 gigas, antes de compilar, se a gente não diminuir o tamanho dele, o binário vai receber o que programamos e reduzir o básico, se o binário reduzir tudo estaria alterando a nossa programação, então quanto menor o código antes de compilar, acho que interfere na velocidade.
O tamanho do código fonte não afeta a performance do seu programa.
O que influencia são os recursos usados. Por exemplo, imagina que está programando em C e tá usando muito malloc(). Alocar memória é custoso e seria bom bolar uma estratégia para invocar esta função o mínimo possível.
Depois de compilado seu código em linguagem de alto nível é reduzido a instruções simples e compactas. Nem o nome que vc dá pra variáveis faz diferença.
E falando em nome de variáveis, se teu jogo chegou a gigabytes significa que não é um programa trivial. Sendo assim, preocupe-se em escrever código legível, bem documentado e que faça uso de boas práticas para facilitar manutenção e ampliação futuras.
Valeu pela resposta, vou pesquisar sobre alocação de memória.