Existe isto no JAVA

Pessoal sou programador web e no JavaScript utilizo o prototype para extender os Objetos ex

String.prototype.alerta = function(){ alert(this); }

“Olá”.alerta();

Neste exemplo adicionei o metodo “alerta” ao Objeto String, tem como fazer isto no Java?

Não existe não … o unico modo de extender uma funcionalidade é dar “extends”(herança) na classe que deseja especificar.
NO caso o String nem isso é possivel pois ela é final

No C# isso é possível através de extension methods. Ficaria assim:

[code]public static class StringExtensions {
public void alert(this String valor) {
//faz qualquer coisa
}
}

String x = new String();
x.alerta(); //Chama o método alerta de StringExtensions[/code]

Deve ter um framework pra isso. :roll:

Não existe metaprogramação em java. Se vc quizer uma linguagem que possua isto te recomendo Ruby ou Python, que possuem classes abertas parecido com o javascript.

Para se ter uma idéia nem é possivel fazer uma função anonima igual vc esta fazendo em javascript. Em java metodos nem são cidadões de primeira classe :frowning:

Pessoal fiquei com uma duvida … utilizando RHINO isso é possivel ?

Segue conclusão. Funciona sim !!!

[code]package br.com.sample;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Teste {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(“JavaScript”);
engine.eval(“var a = function (){return ‘marcelo’};”);
System.out.println(engine.eval(“a()”));
}
} [/code]

O que vc fez é diferente do que o colega fez. Você criou uma variável que o tipo é uma função.

O que ele quer saber é sobre pegar uma classe já pronta, e adicionar uma função extra.

Neste caso funciona também

[code]package br.com.sample;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Teste {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(“JavaScript”);
engine.eval(“String.prototype.teste = function (){return ‘opa’};”);
System.out.println(engine.eval("‘marcelo’.teste()"));
}
} [/code]

Agora eu entendi prq eu tenho que colocar o using System.Linq para funcionar o metodo Where e Select nas minhas listas. Eu começei a usar C# agora nesse mês em janeiro, em um projeto aqui no meu trampo, to apanhando pra caramba.

Cada dia fico mais impressionado com o que o C# tem e o Java não tem. Como por exemplo os delegates em conjunto com o lambda operator, query linq, var keyword, propriedades, anonymous types e etc…

Mas vc ta adiconando na classe String do javascript e não do Java, so esta usando um egine de script do java 6 para fazer isso a partir de um codigo java.

O cara queria saber se é possivel adicionar na classe String do java.

Por mim tinham que incorporar algo como o LINQ no Java. Os extension methods são legaizinhos, mas não deixam de ser sintax suggars. Agora, rodar queries em collections é realmente um recurso fantástico.

Em C#, para selecionar o nome de todos os alunos presentes numa turma é assim:

IList<Aluno> alunos = daoAlunos.carregarTurma(3); IList<String> alunosPresentes = new List<String>(from aluno in alunos where aluno.isPresente() == true select aluno.nome);

Nada de for, e deixe que ele ache a melhor estratégia para resolver essa encrenca.

IList<Aluno> alunos = daoAlunos.carregarTurma(3);
alunos.Where(x => x.isPresente()).ToList();

So que no meu caso eu não estou pegando apenas o Nome. Tb acho interessante essa forma usando Lambda Operators, fica bem parecido com ruby onde raramente é preciso interar uma lista.

alunos.select {|a| a.isPresente()}

Obrigado pelas respostas

O amigo ovelha tem razão é interressante poder utilizar o ScriptEngineManager mas não extende a partir do java…

Sobre o LINQ, é possível obter este recurso atraves do Hibernate e foi a microsoft que copiou a idéia dele.

O Hibernate existe bem antes do LINQ tanto que a versão para o .NET foi descontinuado…

Abraços…

Não é bem assim não, com o linq vc pode fazer query em praticamente qualquer coisa desde que vc tenha um provider escrito para tal. Fora que as querys linq, se vc reparar no exemplo do Vinni ela não esta como uma string igual se faz com hql. Por essa razão a query é validada em tempo de compilação, coisa que o hibernate nem sonha em fazer.

Fora que com Linq se pode criar objetos on the fly para retorno da query, coisa que o hibernate nem sonha, o maximo que se da para fazer com hibernate que é parecido seria retornar um Array de Object.

Não acho que Linq e Hibernate sejam tecnologias a se comparar, elas tem objetivos diferentes apesar de serem parecidas. Não se faz mapeamento relacional objeto com o linq como se faz com o hibernate, para isso existem outras coisas em .net como por exemplo o Entity Framework.

Vc pode retornar um Array de qualquer classe, não necessariamente um Object

Concordo com o ovelha. Comparar hibernate com LINQ é comparar mamão com abacaxi. Os dois são frutas, mas a semelhança para por aí.