Desafio

Sem mudar nada no código da main(), mas podendo mudar qualquer coisa na classe, ou criar outras classes, faça o código abaixo imprimir “1,2,3” :twisted:

public class Foo { public static void main(String[] args) { System.out.println("a,b,c"); } }

public class Foo { 
	static {
		System.out.println("1,2,3");
		System.exit(0);
	}

	public static void main(String[] args) { 
		System.out.println("a,b,c"); 
	} 
}

:wink:

Rafael

hhmm… da pra fazer um aspecto tambem :mrgreen:

Rafael

Hmm, legal, mas tem mil maneiras de se fazer Neston. Eu encontrei pelo menos 4 jeitos de fazer além do que o Rafael mostrou. Vamo lá galera, criatividade! :smiley:

[code]public class Foo {
public static void main(String[] args) {
System.out.println("a,b,c");
}
}

class System {
static Out out = new Out();
}

class Out {
public void println(String abc){
java.lang.System.out.println("1,2,3");
}
}[/code]

Vale?

minha tentativa:

import java.io.OutputStream;
import java.io.PrintStream;

public class Foo{

	static{
		System.setOut(new MyPrintStream(System.out));
	}

	private static class MyPrintStream extends PrintStream{
			
		PrintStream out;
			
		public MyPrintStream(OutputStream out) {
			super(out);
			this.out = (PrintStream)out;
		}

		public void println(String s){			
			out.println("1,2,3");
		}
	
	}

	public static void main(String [] args){	
		System.out.println("a,b,c");
	}

}

Claro, André! :smiley:

A minha melhor solução até agora foi parecida:

[code]public class Foo {

static Foo System = new Foo();
static Foo out = new Foo();

void println(String b) {
	java.lang.System.out.println("1, 2, 3");
}

public static void main(String[] args) {
	System.out.println("a, b, c");
}

}[/code]

…mas ela usa duas classes a menos :wink:

Na verdade onde vc está imprimindo “c” vai “1,2,3”, neh, cv?

Bem, a regra básica é que a linha de comando seja obrigatoriamente “java Foo”, neh?

reformulei a minha tentativa, acho q ficou mais elegante agora (antes tava meio esquisito…)

import java.io.OutputStream; 
import java.io.PrintStream; 

public class Foo{ 

   static{ 
	  System.setOut(new MyPrintStream(System.out)); 
   } 

   private static class MyPrintStream extends PrintStream{ 
               
	  public MyPrintStream(OutputStream out) { 
		 super(out); 
	  } 

	  public void println(String s){          
		 super.println("1,2,3"); 
	  } 
    
   } 

   public static void main(String [] args){    
	  System.out.println("a,b,c");
   } 

}

deixando a do FLC mais bacana ainda.

import java.io.PrintStream;

public class Foo{ 

   static{ 
     System.setOut(new PrintStream(System.out) {
     	public void println(String s) {
     		String temp = s;
     		
     		temp = temp.replaceAll("a","1");
     		temp = temp.replaceAll("b","2");
     		temp = temp.replaceAll("c","3");
     		super.println(temp);
     	}
     }); 
   } 

   public static void main(String [] args){    
     System.out.println("a,b,c"); 
   } 

} 

sem contar que poderia ahver um crypto.properties com os replaces:

a=1
b=2
c=3

que tal:

public class Foo {
     static {
         System.out.println("1,2,3");
         System.exit(0);
     }
    public static void main(String[] args) {
        System.out.println("a,b,c");
    }
}

Tipo, vale mexer em tudo menos no main ne? Vale em volta? hehehehe

public class Foo {
    public static void main(String[] args) {
        System.out.println("1,2,3");
    } 
    static class x {
        public static void main(String[] args) {
           System.out.println("a,b,c");
        }
    }
}

Esse post acabou me fazendo lembrar de uma das coisas mais estranhas que eu já vi em Java.
http://www.artima.com/weblogs/viewpost.jsp?thread=4864

Acho que deve ser tambem a maneira menos usual de fazer isso que o cv falou. Haja reflection!

Até.

Afe… com base nisso da pra incluir mais um entao:

class Teste 
{
	
	private static Field value;

	static {
		try {
			value = String.class.getDeclaredField("value");
			value.setAccessible(true);
			value.set("a,b,c", "1,2,3".toCharArray());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	

	public static void main(String[] args) 
	{
		System.out.println("a,b,c");
	}
}

Rafael

Olá

Esta pasta acabou ficando du caramba! Já reli umas 3 vezes pelo menos.

As soluções todas foram muito legais. Foi o máximo de deliciosa cultura inútil sobre linguagem Java. Mas a última do Rafael é a chamada “côdiloko”. Outro maluco que usou isto está em 2001-03-21 The Java Specialists’ Newsletter [Issue 014] - Insane Strings.

[]s
Luca

A última solução do Rafael faz um belo par com a assinatura… :smiley:

Olá

Ei, desculpe Cancao. Só agora que reparei que o artigo do Artima é o Heinz Kabutz. É o cara do JavaSpecialists do link que citei. Seu link é mais legal e mais completo.

Tudo que li nesta pasta espero esquecer na hora que for escrever algum código sério. Se um programador comum escrevesse um negócio do tipo do Heinz Kabutz levaria 80 chibatadas em praça pública.

[]s
Luca