Qual é a diferença entre campo, variável, atributo e propriedade em Java POJOs?

142

Ao me referir a variáveis ​​privadas internas de Java POJOs que possuem getters / setters, usei os seguintes termos:

  • campo
  • variável
  • atributo
  • propriedade

Existe alguma diferença entre os itens acima? Em caso afirmativo, qual é o termo correto a ser usado? Existe um termo diferente para usar quando essa entidade persistir?

Victor Lyuboslavsky
fonte

Respostas:

117

A partir daqui: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • campo

    • Um membro de dados de uma classe. Salvo indicação em contrário, um campo não é estático.

  • propriedade

    • Características de um objeto que os usuários podem definir, como a cor de uma janela.

  • atributo

    • Não listado no glossário acima

  • variável

    • Um item de dados nomeado por um identificador. Cada variável tem um tipo, como int ou Object, e um escopo. Consulte também variável de classe, variável de instância, variável local.
jahroy
fonte
27
Ainda não entendo a diferença entre um campo e uma propriedade?
Koray Tugay
1
@KorayTugay - Veja um campo como uma peça rudimentar de dados relacionados a um objeto. Uma propriedade (para mim) é uma característica de um objeto que é visível (e aparentemente mutável) para o mundo exterior.
jahroy
Com base no exposto, seria justo dizer "Propriedades e campos são iguais, exceto que uma propriedade é um campo configurável "?
Jdurston
2
@ John - Talvez com base no exposto acima, que, como observado, é uma cópia / pasta da Oracle. Pessoalmente, eu faria a distinção de que uma propriedade é publicamente visível e possivelmente mutável, enquanto um campo poderia ser um campo interno e privado usado apenas pela classe.
jahroy
1
Acho que o melhor a salientar é que a existência como campo e propriedade não é mutuamente exclusiva. Do modo como essa resposta é formulada, para novos desenvolvedores, parece uma lista de coisas distintas.
Kartik Chugh
89

Sim existe.

A variável pode ser local, campo ou constante (embora isso seja tecnicamente errado). É um atributo vago. Além disso, você deve saber que algumas pessoas gostam de chamar variáveis ​​não estáticas finais (local ou instância)

" Valores ". Provavelmente, isso vem de linguagens emergentes da JVM FP como o Scala.

O campo geralmente é uma variável privada em uma classe de instância. Isso não significa que existe um getter e um setter.

Atributo é um termo vago. Pode ser facilmente confundido com XML ou Java Naming API. Tente evitar o uso desse termo.

Propriedade é a combinação getter e setter.

Alguns exemplos abaixo

public class Variables {

    //Constant
    public final static String MY_VARIABLE = "that was a lot for a constant";

    //Value
    final String dontChangeMeBro = "my god that is still long for a val";

    //Field
    protected String flipMe = "wee!!!";

    //Property
    private String ifYouThoughtTheConstantWasVerboseHaHa;

    //Still the property
    public String getIfYouThoughtTheConstantWasVerboseHaHa() {
        return ifYouThoughtTheConstantWasVerboseHaHa;
    }

    //And now the setter
    public void setIfYouThoughtTheConstantWasVerboseHaHa(String ifYouThoughtTheConstantWasVerboseHaHa) {
        this.ifYouThoughtTheConstantWasVerboseHaHa = ifYouThoughtTheConstantWasVerboseHaHa;
    }

}

Existem muitas outras combinações, mas meus dedos estão ficando cansados ​​:)

Adam Gent
fonte
3
@ Chris Thompson Isso é o que o Eclipse chama em um de seus diálogos. Ei pessoal, é Java. O que posso lhe dizer? Isso não faz sentido.
Adam Gent
4
@AdamGent JAVA = Apenas outra sigla vaga :)
emory
@emory Bem, é o antigo oxímoro conhecido. Isso não é nada específico para Java, que "problema" vai para trás até pelo menos C e provavelmente mais .. obviamente, nada impede você de chamá-lo apenas "constante"
Voo
@AdamGent não era sério, apenas dando-lhe um tempo difícil ;-)
Chris Thompson
1
Boa explicação ao tirar sarro de como os nomes dos identificadores podem ficar ridiculamente longos (e eles ficam ridiculamente longos com frequência).
Sargas
5

Se sua pergunta foi solicitada usando JAXB e desejando escolher a correta XMLAccessType, eu tive a mesma pergunta. O Javadoc JAXB diz que um "campo" é uma variável de instância não estática e não transitória. Uma "propriedade" possui um par getter / setter (portanto, deve ser uma variável privada). Um "membro público" é público e, portanto, provavelmente é uma constante. Também no JAXB, um "atributo" refere-se a parte de um elemento XML, como em <myElement myAttribute="first">hello world</myElement>.

Parece que uma "propriedade" Java, em geral, pode ser definida como um campo com pelo menos um getter ou algum outro método público que permita obter seu valor. Algumas pessoas também dizem que uma propriedade precisa ter um levantador. Para definições como essa, o contexto é tudo.

hotshot309
fonte
5

Dietel e Dietel têm uma boa maneira de explicar campos vs variáveis.

“Juntas, as variáveis ​​estáticas e as variáveis ​​de instância de uma classe são conhecidas como seus campos.” (Seção 6.3)

"As variáveis ​​devem ser declaradas como campos apenas se forem necessárias para uso em mais de um método da classe ou se o programa salvar seus valores entre as chamadas para os métodos da classe". (Seção 6.4)

Portanto, os campos de uma classe são suas variáveis ​​estáticas ou de instância - ou seja, declaradas com o escopo da classe.

Referência - Dietel P., Dietel, H. - Java ™ Como Programar (Objetos Antigos), Décima Edição (2014)

Manga
fonte
3

Se você pegar uma pista do Hibernate:

O Hibernate lê / grava o estado do objeto com seu campo. O Hibernate também mapeia as propriedades do estilo Java Bean para o Esquema DB. Hibernar Acesse os campos para carregar / salvar o objeto. Se o mapeamento for feito por propriedade, o hibernate usará o getter e o setter.

É o Encapsulamento que diferencia os meios em que você obtém getters / setters para um campo e é chamado de propriedade. Com isso, ocultamos a estrutura de dados subjacente dessa propriedade em setMethod, podemos impedir alterações indesejadas em setters. Tudo o que encapsulamento significa ...

Os campos devem ser declarados e inicializados antes de serem utilizados. Principalmente para uso interno da classe.

As propriedades podem ser alteradas pelo setter e são expostas pelos getters. Aqui o preço do campo tem getter / setters, por isso é propriedade.

class Car{
 private double price;
 public double getPrice() {…};
 private void setPrice(double newPrice) {…};
}

<class name="Car" …>
<property name="price" column="PRICE"/>
</class>

Da mesma forma, usando campos , [No modo de hibernação, é a maneira recomendada de mapear usando campos, onde private int id; está anotado em @Id, mas com Property você tem mais controle]

class Car{
  private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>

O documento Java diz: Field é um membro de dados de uma classe. Um campo é uma variável de instância não estática e não transitória. O campo geralmente é uma variável privada em uma classe de instância.

vimal krishna
fonte
2

As variáveis ​​são compostas por campos e não campos.

Os campos podem ser:

  1. Campos estáticos ou
  2. campos não estáticos também chamados instanciações, por exemplo, x = F ()

Os não campos podem ser:

  1. variáveis ​​locais, o análogo de campos, mas dentro de métodos e não fora de todos eles, ou
  2. parâmetros, por exemplo, y em x = f (y)

Em conclusão, a principal distinção entre variáveis ​​é se são campos ou não campos, significando se estão dentro de um método ou fora de todos os métodos.

Exemplo básico (desculpe-me pela minha sintaxe, sou apenas um iniciante)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
the_prole
fonte
1

Na verdade, esses dois termos costumam ser usados ​​para representar a mesma coisa, mas existem algumas situações excepcionais. Um campo pode armazenar o estado de um objeto. Todos os campos também são variáveis. Portanto, é claro que pode haver variáveis ​​que não são campos. Assim, olhando para o tipo de 4 variáveis ​​(variável de classe, variável de instância, variável local e variável de parâmetro), podemos ver que variáveis ​​de classe e variáveis ​​de instância podem afetar o estado de um objeto. Em outras palavras, se uma variável de classe ou instância for alterada, o estado do objeto será alterado. Então, podemos dizer que variáveis ​​de classe e variáveis ​​de instância são campos, enquanto variáveis ​​locais e variáveis ​​de parâmetro não são.

Se você deseja entender mais profundamente, acesse a fonte abaixo: -

http://sajupauledayan.com/java/fields-vs-variables-in-java

Sagar Patel
fonte
0

A questão é antiga, mas outra diferença importante entre uma variável e um campo é que um campo obtém um valor padrão quando é declarado. Uma variável, por outro lado, deve ser inicializada.

Peter Clause
fonte
Que tal uma propriedade?
Koray Tugay
0

Meu entendimento é o seguinte, e não estou dizendo que isso seja 100% correto, posso estar enganado.

Uma variável é algo que você declara, que por padrão pode mudar e ter valores diferentes, mas que também pode ser explicitamente considerado final. Em Java, isso seria:

public class Variables {

    List<Object> listVariable; // declared but not assigned
    final int aFinalVariableExample = 5; // declared, assigned and said to be final!

    Integer foo(List<Object> someOtherObjectListVariable) {
        // declare..
        Object iAmAlsoAVariable;

        // assign a value..
        iAmAlsoAVariable = 5;

        // change its value..
        iAmAlsoAVariable = 8;

        someOtherObjectListVariable.add(iAmAlsoAVariable);

        return new Integer();
    }
}

Então, basicamente, uma variável é qualquer coisa que é declarada e pode conter valores. O método foo acima retorna uma variável, por exemplo. Retorna uma variável do tipo Integer que mantém o endereço de memória do novo Integer (); Tudo o que você vê acima também são variáveis, listVariable, aFinalVariableExample e explicadas aqui:

Um campo é uma variável em que o escopo é mais claro (ou concreto). A variável que retorna do escopo do método foo não é clara no exemplo acima, portanto, eu não chamaria isso de campo. Por outro lado, iAmAlsoVariable é um campo "local", limitado pelo escopo do método foo, e listVariable é um campo de "instância" em que o escopo do campo (variável) é limitado pelo escopo dos objetos.

Uma propriedade é um campo que pode ser acessado / alterado. Qualquer campo que expõe um getter / setter é uma propriedade.

Eu não sei sobre atributo e também gostaria de repetir que esse é meu entendimento sobre o que são variáveis, campos e propriedades.

Koray Tugay
fonte
0
  • variable- endereço de armazenamento nomeado. Toda variável possui um tipo que define um tamanho de memória, atributos e comportamentos. Existem, por tipos de variáveis em Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- variável membro ou membro de dados. É um variabledentro de um class( class variableou instance variable)

  • attribute- em alguns artigos você pode achar que attributeé uma objectrepresentação de class variable. Objectopera pelo attributesqual define um conjunto de características.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ delimitado getter/setter. Ele tem uma sintaxe de campo, mas usa métodos ocultos. Javanão suporta na forma pura. Dê uma olhada Objective-C, Swift,Kotlin

Por exemplo Kotlinexemplo:

//field - Backing Field
class Person {
    var name: String = "default name"
        get() = field
        set(value) { field = value }
}

//using
val person = Person()
person.name = "Alex"    // setter is used
println(person.name)    // getter is used

[Variável Swift, propriedade]

yoAlex5
fonte