В чем разница между полем, переменной, атрибутом и свойством в Java POJO?

Говоря о внутренних частных переменных Java POJO, которые имеют геттеры/сеттеры, я использовал следующие термины:

  • поле
  • Переменная
  • атрибут
  • имущество

Есть ли разница между вышеперечисленным? Если да, то какой правильный термин использовать? Есть ли другой термин для использования, когда эта сущность сохраняется?


person Victor Lyuboslavsky    schedule 11.04.2012    source источник


Ответы (11)


Отсюда: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • поле

    • A data member of a class. Unless specified otherwise, a field is not static.

  • имущество

    • Characteristics of an object that users can set, such as the color of a window.

  • атрибут

    • Not listed in the above glossary

  • Переменная

    • An item of data named by an identifier. Each variable has a type, such as int or Object, and a scope. See also class variable, instance variable, local variable.
person jahroy    schedule 12.04.2012
comment
Я до сих пор не понимаю разницы между полем и свойством? - person Koray Tugay; 18.12.2015
comment
@KorayTugay — посмотрите на поле как на элементарную часть данных, связанных с объектом. Свойство (для меня) — это характеристика объекта, которая видна (и, по-видимому, изменчива) для внешнего мира. - person jahroy; 21.12.2015
comment
Основываясь на вышеизложенном, будет ли справедливо сказать, что свойства и поля — это одно и то же, за исключением того, что свойство является настраиваемым полем? - person jdurston; 22.12.2015
comment
@John - Возможно, на основании вышеизложенного, которое, как уже отмечалось, является копией/вставкой из Oracle. Лично я бы сделал различие, что свойство является общедоступным и, возможно, изменяемым, тогда как поле может быть внутренним, частным полем, используемым только классом. - person jahroy; 23.12.2015
comment
Я думаю, лучше всего подчеркнуть, что существование как поля и свойства не исключают друг друга. Судя по формулировке этого ответа, для новых разработчиков он выглядит как список отдельных вещей. - person Kartik Chugh; 16.12.2016
comment
@jahroy, можно ли с уверенностью сказать, что поле может быть собственностью, когда оно общедоступно, а также не является окончательным? или мы можем сказать, что поле с геттером и сеттером является свойством? - person kaushik; 14.09.2020
comment
Мне не понравилось определение поля. Хотя в глоссарии переменная экземпляра определяется как: *Любой элемент данных, связанный с конкретным объектом. Каждый экземпляр класса имеет свою собственную копию переменных экземпляра, определенных в классе. Также называется полем. * Мне это больше нравится. - person evaldeslacasa; 30.10.2020
comment
@KorayTugay Свойство также является полем, но поле не обязательно является свойством. Свойство — это гипоним поля (а поле — это гипероним свойства). Поле также является свойством, когда его значение может быть установлено (обычно с помощью метода установки). - person simon; 15.01.2021

Да, есть.

Переменная может быть локальной, полевой или постоянной (хотя это технически неправильно). Это расплывчато, как атрибут. Кроме того, вы должны знать, что некоторые люди любят называть final нестатические (локальные или экземплярные) переменные.

"Значения". Вероятно, это происходит из-за новых языков JVM FP, таких как Scala.

Поле обычно является закрытой переменной класса экземпляра. Это не означает, что есть геттер и сеттер.

Атрибут — расплывчатый термин. Его легко спутать с XML или Java Naming API. Старайтесь избегать использования этого термина.

Свойство — это комбинация геттера и сеттера.

Несколько примеров ниже

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;
    }

}

Комбинаций еще много, но пальцы устают :)

person Adam Gent    schedule 11.04.2012
comment
@Chris Thompson Так Eclipse называет это в одном из своих диалогов. Привет, ребята, это Java. Что я могу сказать. Это не имеет смысла. - person Adam Gent; 12.04.2012
comment
@AdamGent JAVA=Еще одна расплывчатая аббревиатура :) - person emory; 12.04.2012
comment
@emory Ну, это старый хорошо известный оксюморон. В этом нет ничего особенного для Java, эта проблема восходит как минимум до C и, возможно, дольше ... очевидно, ничто не мешает вам называть ее просто константой. - person Voo; 12.04.2012
comment
@AdamGent Это было не серьезно, просто доставило тебе неприятности ;-) - person Chris Thompson; 12.04.2012
comment
Я увидел имена @ и подумал, что это шутки с аннотациями. - person NateDSaint; 27.11.2013
comment
Хорошее объяснение, высмеивая, как имена идентификаторов могут быть смехотворно длинными (и они ДЕЙСТВИТЕЛЬНО часто становятся смехотворно длинными). - person sargas; 23.03.2016

Если ваш вопрос был вызван использованием JAXB и желанием выбрать правильный XMLAccessType, у меня был тот же вопрос. JAXB Javadoc говорит, что "поле" является нестатическим, непереходным экземпляром Переменная. «Свойство» имеет пару геттер/сеттер (поэтому это должна быть частная переменная). «Общедоступный член» является общедоступным и, следовательно, вероятно, является константой. Также в JAXB «атрибут» относится к части элемента XML, как в <myElement myAttribute="first">hello world</myElement>.

Кажется, что «свойство» Java в общем случае может быть определено как поле, по крайней мере, с геттером или каким-либо другим общедоступным методом, который позволяет вам получить его значение. Некоторые люди также говорят, что свойство должно иметь сеттер. Для подобных определений контекст — это все.

person hotshot309    schedule 01.05.2013

Дител и Дител отлично объясняют поля и переменные.

«Вместе статические переменные класса и переменные экземпляра известны как его поля». (раздел 6.3)

«Переменные следует объявлять как поля только в том случае, если они требуются для использования более чем в одном методе класса или если программа должна сохранять их значения между вызовами методов класса». (раздел 6.4)

Таким образом, поля класса являются его статическими переменными или переменными экземпляра, т.е. объявленными с областью действия класса.

Справочник - Dietel P., Dietel, H. - Java™ How To Program (Early Objects), десятое издание (2014 г.)

person Mango    schedule 10.02.2016

Если вы берете подсказку из Hibernate:

Hibernate читает/записывает состояние объекта с его полем. Hibernate также сопоставляет свойства стиля Java Bean со схемой БД. Hibernate Доступ к полям для загрузки/сохранения объекта. Если сопоставление выполняется по свойству, hibernate использует геттер и сеттер.

Именно инкапсуляция различает средства, в которых у вас есть геттеры/сеттеры для поля, и оно называется свойством, и мы скрываем базовую структуру данных этого свойства в setMethod, мы можем предотвратить нежелательные изменения внутри сеттеров. Все, что означает инкапсуляция...

Поля должны быть объявлены и инициализированы до их использования. В основном для внутреннего использования класса.

Свойства могут быть изменены установщиком и доступны геттеру. Здесь цена поля имеет геттер/сеттер, так что это свойство.

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

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

Аналогично с использованием полей, [в спящем режиме это рекомендуемый способ MAP с использованием полей, где private int id; аннотируется @Id, но с Property у вас больше контроля]

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

Документ Java говорит: Поле является членом данных класса. Поле не является статическим, непереходной переменной экземпляра. Поле обычно является частной переменной в классе экземпляра.

person vimal krishna    schedule 28.12.2016
comment
И в Hibernate термин атрибут также имеет значение: поля или свойства, которые сохраняются, называются постоянными атрибутами [...] все состояние объекта полностью состоит из типов значений. Эти поля состояния или свойства JavaBean называются постоянными атрибутами. - person Dario Seidl; 17.03.2021

Переменные состоят из полей и неполей.

Поля могут быть:

  1. Статические поля или
  2. нестатические поля, также называемые экземплярами, например. х = F()

Неполя могут быть:

  1. локальные переменные, аналог полей, но внутри методов, а не вне их всех, или
  2. параметры напр. у в х = f (у)

В заключение, ключевое различие между переменными заключается в том, являются ли они полями или не полями, то есть находятся ли они внутри методов или вне всех методов.

Базовый пример (извините за мой синтаксис, я всего лишь новичок)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
person the_prole    schedule 29.08.2013

Разница между переменной, полем, атрибутом и свойством в Java:

Переменная — это имя, присвоенное ячейке памяти. Это основная единица хранения в программе.

Поле — это элемент данных класса. Если не указано иное, поле может быть общедоступным, статическим, нестатическим и окончательным.

Атрибут — это еще один термин для поля. Обычно это общедоступное поле, к которому можно получить прямой доступ.

  • В NetBeans или Eclipse, когда мы вводим объект класса и после этой точки (.), они дают некоторое предложение, которое называется атрибутами.

Свойство — это термин, используемый для полей, но обычно он имеет комбинацию методов получения и установки.

person rarora25    schedule 29.12.2020

На самом деле эти два термина часто используются для обозначения одного и того же, но бывают и исключительные ситуации. Поле может хранить состояние объекта. Также все поля являются переменными. Итак, ясно, что могут быть переменные, которые не являются полями. Итак, изучая 4 типа переменных (переменная класса, переменная экземпляра, локальная переменная и переменная параметра), мы видим, что переменные класса и переменные экземпляра могут влиять на состояние объекта. Другими словами, если изменяется переменная класса или экземпляра, изменяется состояние объекта. Таким образом, мы можем сказать, что переменные класса и переменные экземпляра являются полями, а локальные переменные и переменные параметров — нет.

Если вы хотите понять более глубоко, вы можете перейти к источнику ниже: -

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

person Sagar Patel    schedule 10.02.2016

Вопрос старый, но еще одно важное различие между переменной и полем заключается в том, что поле получает значение по умолчанию при его объявлении. С другой стороны, переменная должна быть инициализирована.

person Peter Clause    schedule 08.03.2016
comment
Как насчет собственности? - person Koray Tugay; 14.04.2016

Я понимаю, как показано ниже, и я не говорю, что это на 100% правильно, я могу ошибаться.

Переменная — это то, что вы объявляете, что может по умолчанию изменяться и иметь разные значения, но также может быть явно указано, что оно является окончательным. В Java это будет:

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();
    }
}

Таким образом, переменная — это все, что объявлено и может содержать значения. Например, вышеприведенный метод foo возвращает переменную. Он возвращает переменную типа Integer, которая содержит адрес памяти нового Integer(); Все остальное, что вы видите выше, также является переменными, listVariable, aFinalVariableExample и объясняется здесь:

Поле — это переменная, область действия которой более ясна (или конкретна). Переменная, возвращаемая из области видимости метода foo, в приведенном выше примере неясна, поэтому я бы не стал называть ее полем. С другой стороны, iAmAlsoVariable — это «локальное» поле, ограниченное областью действия метода foo, а listVariable — это поле «экземпляра», где область действия поля (переменной) ограничена областью действия объектов.

Свойство — это поле, к которому можно получить доступ/изменить. Любое поле, которое предоставляет геттер/сеттер, является свойством.

Я не знаю, что такое атрибут, и я также хотел бы повторить, что это мое понимание того, что такое переменные, поля и свойства.

person Koray Tugay    schedule 20.12.2016

  • variable - именованный адрес хранилища. Каждая переменная имеет тип, который определяет размер памяти, атрибуты и поведение. Существуют типы переменных Java: class variable, instance variable, local variable, method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field - переменная-член или элемент данных. Это variable внутри class(class variable или instance variable)

  • attribute - в некоторых статьях вы можете найти, что attribute это object представление class variable. Object оперирует attributes, которые определяют набор характеристик.

CustomClass myCustomClass = new CustomClass();
myCustomClass.myAttribute = "poor fantasy"; //`myAttribute` is an attribute of `myCustomClass` object with a "poor fantasy" value

[атрибуты Objective-C]

  • property - field + ограниченный getter/setter. Он имеет синтаксис поля, но использует внутренние методы. Java не поддерживает его в чистом виде. Взгляните на Objective-C, Swift, Kotlin

Например Kotlin образец:

//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

[Переменная Swift, свойство...]

person yoAlex5    schedule 28.03.2020