@ yegor256 Eu entendo sua analogia cachorro e bola e até a apóio, mas e quando um objeto de "organismo vivo" armazena o valor primitivo ocasional, por exemplo, um ID? E se você quiser ir um passo além da simples atribuição, mas não quiser escrever uma nova classe apenas para lidar com valores primitivos?
Jacksonkr
Respostas:
127
O tutorial não é realmente necessário para isso. Leia sobre encapsulamento
privateString myField;//"private" means access to this is restrictedpublicString getMyField(){//include validation, logic, logging or whatever you like herereturnthis.myField;}publicvoid setMyField(String value){//include more logicthis.myField = value;}
portanto, getter é apenas um método para obter um campo privado e setter está definindo um novo campo. obrigado pela excelente explicação por código
ajsie
1
você poderia passar um parâmetro para um getter?
ajsie
2
noname: Não e não. Getter é uma maneira de obter um valor, mas NÃO expor o valor contido em um campo, ou seja, se você chamá- someObj.getTime().setHour(5)lo, não deve afetar someObjo estado interno de. Além disso, setters e getters (acessadores e modificadores por seus nomes mais elaborados) têm uma assinatura de método muito estrita, o que significa que getter não possui parâmetros. Métodos em geral devem fazer apenas uma coisa de qualquer maneira.
Esko
4
@noname: Quando coisas simples recebem nomes complexos / grandes / abstratos, você tem o que é chamado de "padrão de design" ... E este é um exemplo do Padrão de Explicação de Conceito Recursivo que acabei de inventar ;-)
espaço de nomes
3
@qed: a thispalavra-chave é opcional, a menos que haja um conflito com algo que tenha um escopo mais específico. No exemplo que você deu, o configurador que é criado terá um único parâmetro cujo nome corresponde ao nome do campo, portanto this.fieldName = fieldName, é usado para distinguir que o campo está sendo atribuído ao invés do parâmetro sendo atribuído a ele mesmo, como fieldName = fieldnameocorreria. Esse conflito não existe no getter.
Paul Creasey
39
Em Java, getters e setters são funções completamente comuns. A única coisa que os torna getters ou setters é a convenção. Um getter para foo é chamado getFoo e o setter é chamado setFoo. No caso de um booleano, o getter é denominado isFoo. Eles também devem ter uma declaração específica, conforme mostrado neste exemplo de um getter e setter para 'nome':
O motivo de usar getters e setters em vez de tornar seus membros públicos é que isso torna possível alterar a implementação sem alterar a interface. Além disso, muitas ferramentas e kits de ferramentas que usam reflexão para examinar objetos aceitam apenas objetos que possuem getters e setters. JavaBeans, por exemplo, deve ter getters e setters, bem como alguns outros requisitos.
O vazio é realmente necessário aqui. Se você não tiver, receberá:error: invalid method declaration; return type required
Dan
3
O vazio não é necessário aqui
Shashi Kiran
2
@JasonHartley: Um construtor não tem um tipo de retorno.
wassimans
@Mark Byers Portanto, o construtor é usado para inicializar a instância, e o setter é usado para alterar qualquer atributo dado. Isso está correto?
carloswm85 de
12
classClock{String time;void setTime (String t){
time = t;}String getTime(){return time;}}classClockTestDrive{publicstaticvoid main (String[] args){Clock c =newClock;
c.setTime("12345")String tod = c.getTime();System.out.println(time:"+ tod);}}
Quando você executa o programa, o programa começa na rede,
objeto c é criado
função setTime()é chamada pelo objeto c
a variável timeé definida para o valor passado por
Embora os métodos getter / setter sejam comuns em Java, eles não são particularmente orientados a objetos (OO). Na verdade, eles podem prejudicar a manutenção do seu código. Além disso, a presença de vários métodos getter e setter é um sinalizador vermelho de que o programa não é necessariamente bem projetado de uma perspectiva OO.
Este artigo explica por que você não deve usar getters e setters (e quando você pode usá-los) e sugere uma metodologia de design que o ajudará a romper a mentalidade getter / setter.
1. Os melhores getters / setters são inteligentes.
Aqui está um exemplo de javascript de mozilla:
var o ={ a:0}// `o` is now a basic objectObject.defineProperty(o,"b",{
get: function (){returnthis.a +1;}});
console.log(o.b)// Runs the getter, which yields a + 1 (which is 1)
Eu usei MUITO estes porque são fantásticos . Eu iria usá-lo para obter detalhes com minha codificação + animação. Por exemplo, faça um setter que lida com um Numberque exibe aquele número em sua página da web. Quando o setter é usado, ele anima o número antigo para o novo número usando um interpolador . Se o número inicial for 0 e você configurá-lo como 10, você verá os números mudarem rapidamente de 0 para 10 ao longo de, digamos, meio segundo. Os usuários adoram essas coisas e é divertido de criar.
2. Getters / setters em php
Exemplo de sof
<?php
classMyClass{private $firstField;private $secondField;public function __get($property){if(property_exists($this, $property)){return $this->$property;}}public function __set($property, $value){if(property_exists($this, $property)){
$this->$property = $value;}return $this;}}?>
Aqui está um exemplo para explicar a maneira mais simples de usar getter e setter em java. Pode-se fazer isso de uma maneira mais direta, mas getter e setter têm algo especial que é ao usar o membro privado da classe pai na classe filha na herança. Você pode tornar isso possível usando getter e setter.
package stackoverflow;publicclassStackoverFlow{privateint x;publicint getX(){return x;}publicint setX(int x){returnthis.x = x;}publicvoid showX(){System.out.println("value of x "+x);}publicstaticvoid main(String[] args){StackoverFlow sto =newStackoverFlow();
sto.setX(10);
sto.getX();
sto.showX();}}
Não vou rejeitar você (não vale o esforço). Esteja ciente de que (1) Você respondeu a uma pergunta sobre Java , onde a linguagem do programa deveria estar em Java. (2) Se você deseja postar, certifique-se de que o layout seja feito corretamente. (3) Seu uso de encapsulamento (getter (ou acessador) e setters (ou mutadores)) está incorreto. Por favor, veja o que significa encapsulamento ... (Verifique a resposta votada)
KarelG
1
@KarelG desculpe, não li as tags. Eu atualizei para java. obrigado por me perceber.
Respostas:
O tutorial não é realmente necessário para isso. Leia sobre encapsulamento
fonte
someObj.getTime().setHour(5)
lo, não deve afetarsomeObj
o estado interno de. Além disso, setters e getters (acessadores e modificadores por seus nomes mais elaborados) têm uma assinatura de método muito estrita, o que significa que getter não possui parâmetros. Métodos em geral devem fazer apenas uma coisa de qualquer maneira.this
palavra-chave é opcional, a menos que haja um conflito com algo que tenha um escopo mais específico. No exemplo que você deu, o configurador que é criado terá um único parâmetro cujo nome corresponde ao nome do campo, portantothis.fieldName = fieldName
, é usado para distinguir que o campo está sendo atribuído ao invés do parâmetro sendo atribuído a ele mesmo, comofieldName = fieldname
ocorreria. Esse conflito não existe no getter.Em Java, getters e setters são funções completamente comuns. A única coisa que os torna getters ou setters é a convenção. Um getter para foo é chamado getFoo e o setter é chamado setFoo. No caso de um booleano, o getter é denominado isFoo. Eles também devem ter uma declaração específica, conforme mostrado neste exemplo de um getter e setter para 'nome':
O motivo de usar getters e setters em vez de tornar seus membros públicos é que isso torna possível alterar a implementação sem alterar a interface. Além disso, muitas ferramentas e kits de ferramentas que usam reflexão para examinar objetos aceitam apenas objetos que possuem getters e setters. JavaBeans, por exemplo, deve ter getters e setters, bem como alguns outros requisitos.
fonte
error: invalid method declaration; return type required
Quando você executa o programa, o programa começa na rede,
setTime()
é chamada pelo objeto ctime
é definida para o valor passado porgetTime()
é chamada pelo objeto ctod
etod
ser impressofonte
Você também pode querer ler " Por que os métodos getter e setter são ruins ":
fonte
1. Os melhores getters / setters são inteligentes.
Aqui está um exemplo de javascript de mozilla:
Eu usei MUITO estes porque são fantásticos . Eu iria usá-lo para obter detalhes com minha codificação + animação. Por exemplo, faça um setter que lida com um
Number
que exibe aquele número em sua página da web. Quando o setter é usado, ele anima o número antigo para o novo número usando um interpolador . Se o número inicial for 0 e você configurá-lo como 10, você verá os números mudarem rapidamente de 0 para 10 ao longo de, digamos, meio segundo. Os usuários adoram essas coisas e é divertido de criar.2. Getters / setters em php
Exemplo de sof
citações:
fonte
Aqui está um exemplo para explicar a maneira mais simples de usar getter e setter em java. Pode-se fazer isso de uma maneira mais direta, mas getter e setter têm algo especial que é ao usar o membro privado da classe pai na classe filha na herança. Você pode tornar isso possível usando getter e setter.
fonte