Como programador Java mas entusiasta de novas linguagens, acabo por sentir falta de alguns recursos que facilitam muito o trabalho, ou que pelo menos para mim fazem mais sentido usar.Posso comecar com um estudo de caso simples: dada uma String retornar o numero de palavras.E assim mesmo, simples assim, inclusive muito facil de implementar em qualquer linguagem, mas a questao nao e essa, como desenvolvedor eu quero usar orientacao a objetos no projeto.Vamos a uma implementacao tosca em Java:String frase = "Uma frase de exemplo";System.out.println(frase.trim().split("\\s+").length);Deu. Mostra 4. Entretanto eu quero reutilizar esta funcionalidade entao em componentizo, bem, mas como?Posso usar outro estudo de caso para dramatizar mais a historia: verificar se uma String esta em branco, ou seja, semelhante ao vazio so que ignorando espacos.A implementacao e mediocre:String texto = " ";if (texto.trim().length() == 0) { System.out.println("vazio");}Nao obstante, como no primeiro caso, eu quero componentizar.No Java, e classico fazer uma classe utilitaria, algo como TipoUtils, neste caso, StringUtils:public class StringUtils { public static int words(String str) { return str.trim().split("\\s+").length; } public static boolean isBlank(String str) { return str.trim().length() == 0; }}E uso assim:String texto = " ";if (StringUtils.isBlank(texto)) { System.out.println("vazio");}Ainda posso usar um recurso introduzido no Java 5, o import estatico.import static meu.framework.utils.StringUtils.*;// algumas linhas abaixoString texto = " ";if (isBlank(texto)) { System.out.println("vazio");}Qual o problema com esta implementacao? E que ela soa totalmente procedural em contraste ao modelo OO escolhido, em outras palavras eu queria fazer isso:String texto = " ";// quero o proprio objeto me diga se esta em brancoif (texto.isBlank()) { System.out.println("vazio");} else { // quero que o proprio objeto me diga quantas palavras tem System.out.println("Existem " + texto.words() + " palavra(s)");}Em Java, impossivel. No Java a classe String e final, ou seja, nao pode ser estendida.Para constar, uma extensao da API base do Java ja existe e e distribuida pelo projeto commons do Apache e uma classe StringUtils ja existe para estender as funcionalidades relacionadas a Strings e e muito bem escrita.Mas isso nao me deixa contente por que outras linguagens lidam muito melhor com esta situacao, dando melhor suporte para estender a API base.Vamos ao mesmo exemplo usando C#. No C# e possivel, de certo modo, estender qualquer classe, mesmo as finais (sealed em C#), usando somente a API publica da classe, que ja e suficiente para realizar muitas proezas:public static class StringUtils { public static int Words(this string str) { return Regex.Split(str.Trim(), "\\s+").Length; } public static bool IsBlank(this string str) { return str.Trim().Length == 0; }}Implementacoes de classes estaticas no C# permitem estender a funcionalidade qualquer classe. Na verdade e um acucar sintatico no qual ele passa o conteudo da variavel para o metodo estatico, ainda sendo procedural, mas de melhor leitura e mais elegante que em Java. Eu posso chama-lo assim:string texto = " ";if (texto.IsBlank()) { Console.WriteLine("vazio");} else { Console.WriteLine("Existem " + texto.Words() + " palavra(s)");}Bem mais OO nao acha?Pode ficar ainda melhor em Ruby, onde as classes sao abertas. Em outras palavras, e possivel estender a funcionalidade ate mesmo das classes basicas como String e FixNum (inteiros). Claro que esta liberdade deve ser usada