Por que o Java não possui Accessors (GET SET) como o C#?

em C# temos os Accessors para construção get set, poque o java não possui o mesmo, exemplo:

C#:

class Pessoa
{
    public string nome {
        get; //get comum
        set { //set que valida o parametro
            if (value != null)
                nome = value;
        } 
    }
}

Java (também disponível no C#):

class Pessoa
{
    public String nome;

    public String getNome() {return nome;} //get comum
    public void setNome(String value)
    { //set que valida o parametro
        if (value != null)
            nome = value;
    }
}

porque não implementaram isso simplesmente, umas das coisas q acho ridiculo =(

O uso das propriedades para o .NET nos poupa bastante trabalho, não? É só escrever prop, dar tab duas vezes, e tanto a variável quanto os get e set desta estão implementados. O Java não criou um recurso parecido ainda, por isso não há o uso de propriedades da mesma maneira do .NET, simplesmente por isso.

Vai saber…

No PHP tem os gets e sets, que eles chamam de mágicos, mas prefiro o termo genéricos. Pois quando você não define um get e set específico e na sua classe tem esses dois métodos, então eles passam a interceptar qualquer requisição para os atributos da classe.

Exemplo:

class Carro{

private $cor;
private $marca;

public __get( $atributo ){
   return $this->atributo;
}

public __set($atributo, $valor ){
  $this->atributo = $valor;
}

}

//Depois para usar

$carro = new Carro();

$carro->cor = "vermelho";

echo $carro->cor;

Bem louco né…

Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui?

http://bugs.sun.com/view_bug.do?bug_id=4228585

[quote=drsmachado]Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui? [/quote]

Tá blz, padrões, premissas e definições são importantes, porém é necessário evoluir e simplificar, diferentemente da linguagem natural a linguagem de programação pode ser deixada de lado mais facilmente…

O que eu noto é que muita gente não sabe para que servem REALMENTE os métodos de acesso (get/set).

sim devia ser prioridade para o java isso, chega ser ridiculo não ter

O bug está aberto desde 1999.
Acredito que ele esteja na mesma categoria de “operadores definidos pelo usuário” e “herança múltipla”, ou seja, é algo que o pessoal da Oracle não vai implementar mesmo :slight_smile:

é o gilad.bracha respondeu o bug e não concordava com isso em 1999-04-15 ele alegava que para isso teria que considerar todos os campos privados pro default e isso é uma coisa que ele não poderia fazer.

In practice, I don’t expect such sugar to be added to Java. It adds no real
power, and without corresponding restrictions to enforce its use (i.e.,
make all fields private, which we cannot do) it is fairly inconsequential

não concordo ja que varias linguagens fazem isso.

mais é por que naquela epoca não existia o numero de frameworks que exite hoje dependendo do padrao java beans

Isso aí é fichinha. Ridículo é ver uma porrada de classe no JDK usando vector, o fracasso da API de datas, a gambiarra na implementação de generics, …

[quote] é ver uma porrada de classe no JDK usando vector [/quote] funciona acho q ta tramquilo

[quote] o fracasso da API de datas[/quote] isso realmente mais ja vai sair no java 8

[quote]a gambiarra na implementação de generics[/quote] é totalmente aceitavel para manter a compatibilidade não tem o que fazer e para grande massa não muda em nada no funcional.

os get e set e api de datas muda drasticamente o funcional de quase 100% dos usuarios java.

Se você soubesse ao menos o quão problemático é usar Vector você não diria isso.

Pois é, mas ainda não saiu (e isso que era previso pro Java 7). E enquanto isso temos que lidar com uma API tão bem escrita quanto os funks de hoje.

Isso porque você é um utilizador de ferramentas, quando você for criar uma ferramenta você vai ver o quão complicado é a solução adotada. Eles poderiam ter corrigido isso no Java 7 pelo menos, já que o suporte à versão 5 acabou. Isso iria facilitar muito a vida de quem desenvolve ferramentas.

Com certeza, mas isso significa que deva ser mais prioritário? O invoke dyamic na JVM não afetou quase ninguém diretamente, mas trouxe inúmeras vantagens (principalmente para a galera que mantém as linguagens alternativas na JVM).

[quote=JackOld][quote=drsmachado]Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui? [/quote]

Tá blz, padrões, premissas e definições são importantes, porém é necessário evoluir e simplificar, diferentemente da linguagem natural a linguagem de programação pode ser deixada de lado mais facilmente… [/quote]
Sinceramente, acho essa discussão algo sem fundamento.
Penso da seguinte forma, se você é um serralheiro e não gosta da forma como a serra funciona é por que, provavelmente, você não sabe utilizar a serra.
Se você acha que com um machado conseguiria fazer melhor, so, go ahead dude!.
Trocando em miúdos, não gosta da forma como o java é e acha o .NET melhor, vai programar com .NET e para de reclamar.
E para finalizar, para quem reclama demais saca só

A propósito, se você criar “accessors” da forma padrão (getters / setters), a JVM consegue, em grande parte dos casos, converter isso para um acesso direto a campo, evitando a chamada ao método getter/setter. Existe uma chave na JVM (+XX:+UseFastAccessors) que está ligada por default, ou seja, sempre que possível, a JVM faz essa otimização.

Se o getter/setter tiver mais código que uma atribuição simples (no caso do setter) ou um retorno simples (no caso do getter) ele não pode ser otimizado dessa forma.

Concordo plenamente!

Concordo plenamente![/quote]
Concordo plenamente! [2]

Eu programo em .NET hoje porque meus desenvolvimentos são quase em sua totalidade voltados para WEB, a plataforma me atende melhor em diversas situações que a do JAVA. Isso não desmerece o JAVA e seus recursos, de modo algum. Só não entendo o porquê de discussões tão ferrenhas sobre a preferência alheia. Seria muito mais prático usar essas discussões para procurar pontos fortes em cada uma delas, e assim melhorar o seu conhecimento sobre cada tecnologia em questão.

Quando, no fim dos anos 1980 (me sinto velho quando vejo/escrevo algo assim), o pessoal da Sun começou o que viria a se tornar a plataforma/linguagem java, eles consideraram desenvolver em C.
Acontece que, do C, o java só teve a primeira JVM e a sintaxe, pois o resto foi reescrito.
Reescrito por que? Oras, simplesmente por que os caras viram que gerenciamento automático de memória deixava a atividade de desenvolvimento menos suscetível a erros de programação por desatenção. Aliás, reescrito não, foi criado.
O PHP surgiu por que o autor achava complicado demais programar nas linguagens que existiam à época e, bem, se tornou a linguagem de programação que é hoje. O Ruby nasceu por que o criador desta linguagem achava que seria muito mais interessante escrever códigos sem que estes parecessem codificados demais, quase como linguagem natural. E, bem, ele nasceu.
Indo além, o Pascal nasceu para ser uma linguagem mais fácil de ser aprendida. O C nasceu por que a linguagem, B, anterior era totalmente antididática e complexa (imagine quão complexa era a linguagem B!).
O C# nasceu em sintonia com a plataforma .NET para que fosse possível tentar superar coisas como o VB6 e o ASP clássico. Ele é um parente do java, digamos um irmão, que pode ser lapidado, afinal, foi construído usando o que já havia de bom no Java, somado à várias melhorias.

Portanto, penso que discutir por que a galinha atravessou a rua é, pura e simplesmente, falta do que fazer.

Java não possui essa funcionalidade porque o Gosling desenvolveu essa linguagem para ser simples e de fácil assimilação para quem programa em c. Aliás existem muitas outras que ele deixou de fora com o mesmo intuito, como sobrecarga de operadores, bytes não sinalizados, etc…
Apesar de eu achar properties(properties veio do object pascal e foi adicionada pelo Anders ao c#) uma coisa muito boa, a premissa da linguagem java é por deixar as coisas o mais simples na medida do possível.