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

142

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

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

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

Виктор Любославский
источник

Ответы:

117

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


  • поле

    • Член данных класса. Если не указано иное, поле не является статичным.

  • свойство

    • Характеристики объекта, которые могут быть установлены пользователями, такие как цвет окна.

  • атрибут

    • Не указан в глоссарии выше

  • переменная

    • Элемент данных, названный идентификатором. Каждая переменная имеет тип, например int или Object, и область видимости. Смотрите также переменная класса, переменная экземпляра, локальная переменная.
jahroy
источник
27
Я до сих пор не понимаю разницу между полем и собственностью?
Корай Тугай
1
@KorayTugay - посмотрите на поле как на элементарный элемент данных, связанных с объектом. Свойство (для меня) - это характеристика объекта, который видим (и, видимо, изменчив) для внешнего мира.
Джахрой
Исходя из вышесказанного, будет ли справедливым сказать, что «свойства и поля одинаковы, за исключением того, что свойство является настраиваемым полем»?
Jdurston
2
@John - Возможно, на основании вышеизложенного, который, как отмечалось, является копией / вставкой из Oracle. Лично я бы сделал различие, что свойство является публично видимым и, возможно, изменяемым, тогда как поле может быть внутренним частным полем, используемым только классом.
Джахрой
1
Я думаю, что лучше всего подчеркнуть, что существование как поле и свойство не являются взаимоисключающими. От того, как этот ответ сформулирован, до новых разработчиков, он выглядит как список различных вещей.
Картик Чаг
89

Да, есть.

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

« Ценности ». Это, вероятно, происходит от появляющихся языков FP JVM, таких как Scala.

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

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

Свойство является комбинацией метода получения и установки.

Некоторые примеры ниже

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

}

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

Адам Гент
источник
3
@Chris Thompson Вот как Eclipse называет это в одном из диалогов. Эй, ребята, это Java. Что я могу сказать. Это не имеет смысла.
Адам Гент
4
@AdamGent JAVA = Еще одна смутная аббревиатура :)
emory
@emory Ну, это старый хорошо известный оксюморон. Это не является чем-то конкретным для Java, эта «проблема» восходит, по крайней мере, до C и, вероятно, дольше ... очевидно, ничто не мешает вам называть это просто «константой»
Voo
@AdamGent не был серьезным, просто доставил вам неприятности ;-)
Крис Томпсон
1
Хорошее объяснение, высмеивая, как имена идентификаторов могут быть смехотворно длинными (и они действительно становятся смехотворно длинными).
Саргас
5

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

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

hotshot309
источник
5

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

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

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

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

Справочник - Дител П., Дител, Х. - Как программировать на Java ™ (ранние объекты), десятое издание (2014)

манго
источник
3

Если вы берете подсказку из 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>

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

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

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

Вимал Кришна
источник
2

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

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

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

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

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

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

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

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}
the_prole
источник
1

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

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

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

Сагар Патель
источник
0

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

Питер Клаус
источник
Как насчет собственности?
Корай Тугай
0

Мое понимание, как показано ниже, и я не говорю, что это на 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 является «экземпляром» поля, в котором область действия поля (переменной) ограничена областью действия объектов.

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

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

Корай Тугай
источник
0
  • 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.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • 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

[Быстрая переменная, свойство]

yoAlex5
источник