В чем разница между полем, переменной, атрибутом и свойством в Java POJO?
При обращении к внутренним закрытым переменным Java POJO, которые имеют геттеры / сеттеры, я использовал следующие термины:
- поле
- переменная
- атрибут
- имущество
Есть ли разница между вышеперечисленным? Если да, какой правильный термин использовать? Есть ли другой термин, чтобы использовать, когда эта сущность сохраняется?
11 ответов
Отсюда: http://docs.oracle.com/javase/tutorial/information/glossary.html
поле
- Член данных класса. Если не указано иное, поле не является статичным.
имущество
- Характеристики объекта, которые могут быть установлены пользователями, такие как цвет окна.
атрибут
- Не указан в глоссарии выше
переменная
- Элемент данных, названный идентификатором. Каждая переменная имеет тип, например int или Object, и область видимости. Смотрите также переменную класса, переменную экземпляра, локальную переменную.
Да, есть.
Переменная может быть локальной, полевой или постоянной (хотя это технически неверно). Это расплывчато, как атрибут. Кроме того, вы должны знать, что некоторым людям нравится вызывать окончательные нестатические (локальные или экземплярные) переменные.
"Ценности". Это, вероятно, происходит от появляющихся языков FP JVM, таких как Scala.
Поле обычно является частной переменной в классе экземпляра. Это не значит, что есть геттер и сеттер.
Атрибут является расплывчатым термином. Его легко спутать с API именования XML или 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;
}
}
Есть еще много комбинаций, но мои пальцы устают:)
Если ваш вопрос был вызван с помощью JAXB и вы хотите выбрать правильный XMLAccessType
, У меня такой же вопрос. В JAXB Javadoc говорится, что "поле" - это нестатическая, нестационарная переменная экземпляра. "Свойство" имеет пару геттер / сеттер (поэтому это должна быть закрытая переменная). "Публичный член" является публичным, и поэтому, вероятно, является константой. Также в JAXB "атрибут" относится к части элемента XML, как в <myElement myAttribute="first">hello world</myElement>
,
Кажется, что "свойство" Java, в общем, может быть определено как поле с по крайней мере геттером или каким-либо другим открытым методом, который позволяет вам получить его значение. Некоторые люди также говорят, что у свойства должен быть сеттер. Для таких определений контекст - это все.
Дител и Дител имеют хороший способ объяснения полей и переменных.
"Вместе статические переменные класса и переменные экземпляра известны как его поля". (Раздел 6.3)
"Переменные должны объявляться как поля, только если они необходимы для использования более чем в одном методе класса или если программа должна сохранять их значения между вызовами методов класса". (Раздел 6.4)
Таким образом, поля класса являются его статическими переменными или переменными экземпляра - т.е. объявлены с областью действия класса.
Справочник - Дител П., Дител, Х. - Как программировать на Java™ (Ранние объекты), Десятое издание (2014)
Если вы берете подсказку из 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, но со свойством у вас есть больше контроля]
class Car{
private double price;
}
<class name="Car">
<property name=" price" column="PRICE" access="field"/>
</class>
Документ Java говорит: Поле является членом данных класса. Поле не является статической, не преходящей переменной экземпляра. Поле обычно является частной переменной в классе экземпляра.
Разница между переменной, полем, атрибутом и свойством в Java:
Переменная - это имя, присвоенное ячейке памяти. Это основная единица хранения в программе.
Поле - это член данных класса. Если не указано иное, поле может быть общедоступным, статическим, не статическим и окончательным.
Атрибут - это еще один термин для поля. Обычно это общедоступное поле, к которому можно получить прямой доступ.
- В NetBeans или Eclipse, когда мы вводим объект класса и после этой точки (.) Они дают некоторые предложения, которые называются атрибутами.
Свойство - это термин, используемый для полей, но обычно он имеет комбинацию получателя и установщика.
На самом деле эти два термина часто используются для обозначения одной и той же вещи, но существуют некоторые исключительные ситуации. Поле может хранить состояние объекта. Также все поля являются переменными. Таким образом, ясно, что могут быть переменные, которые не являются полями. Итак, рассматривая переменные типа 4 (переменная класса, переменная экземпляра, локальная переменная и переменная параметра), мы видим, что переменные класса и переменные экземпляра могут влиять на состояние объекта. Другими словами, если переменная класса или экземпляра изменяется, состояние объекта изменяется. Таким образом, мы можем сказать, что переменные класса и переменные экземпляра являются полями, а локальные переменные и переменные параметров - нет.
Если вы хотите понять более глубоко, вы можете перейти к источнику ниже:
Переменные состоят из полей и неполей.
Поля могут быть либо:
- Статические поля или
- нестатические поля, также называемые экземплярами, например, x = F()
Неполями могут быть:
- локальные переменные, аналог полей, но внутри методов, а не вне их всех, или
- параметры, например, у в х = F (у)
В заключение следует отметить, что ключевое различие между переменными заключается в том, являются ли они полями или неполями, то есть находятся ли они внутри методов или вне всех методов.
Базовый пример (извините за синтаксис, я только начинающий)
Class {
//fields
method1 {
//non-fields
}
}
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
Мое понимание, как показано ниже, и я не говорю, что это на 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 является "экземпляром" поля, в котором область действия поля (переменной) ограничена областью действия объектов.
Свойство - это поле, к которому можно получить доступ / изменить его. Любое поле, которое предоставляет метод получения / установки, является свойством.
Я не знаю об атрибутах, и я также хотел бы повторить, что это мое понимание того, что такое переменные, поля и свойства.
Вопрос старый, но еще одно важное различие между переменной и полем состоит в том, что поле получает значение по умолчанию при объявлении. С другой стороны, переменная должна быть инициализирована.