Яка різниця між полем, змінною, атрибутом та властивістю в POJO Java?


142

Звертаючись до внутрішніх приватних змінних Java POJO, у яких є геттери / сетери, я використовував такі терміни:

  • поле
  • змінна
  • атрибут
  • майно

Чи є різниця між перерахованим вище? Якщо так, який правильний термін використовувати? Чи існує інший термін, який слід використовувати, коли ця організація зберігається?

Відповіді:


117

Звідси: http://docs.oracle.com/javase/tutorial/information/glossary.html


  • поле

    • Член даних класу. Якщо не вказано інше, поле не є статичним.

  • майно

    • Характеристики об'єкта, які користувачі можуть встановити, наприклад, колір вікна.

  • атрибут

    • Не вказано у наведеному вище глосарії

  • змінна

    • Елемент даних, названий ідентифікатором. Кожна змінна має тип, наприклад, int або Object, та область. Дивіться також змінну класу, змінну екземпляра, локальну змінну.

27
Я досі не розумію різниці між полем і властивістю?
Корай Тугай

1
@KorayTugay - Подивіться на поле як на рудиментарний фрагмент даних, що стосується об'єкта. Властивість (для мене) - це характеристика предмета, який видимий (і, мабуть, мінливий) для зовнішнього світу.
jahroy

Виходячи з вищесказаного, чи було б справедливо сказати "Властивості та поля однакові, за винятком того, що властивість є полем, що задається "?
jdurston

2
@John - Можливо, виходячи з вищезазначеного, який, як зазначалося, є копією / вставкою від Oracle. Особисто я визначив, що властивість є загальнодоступною та можливо зміненою, тоді як поле може бути внутрішнім, приватним полем, яке використовується лише класом.
jahroy

1
Я думаю, що найкраще наголосити на тому, що існування як поля та властивості не є взаємовиключними. З того, як ця відповідь сформульована, до нових розробників, це схоже на перелік різних речей.
Kartik Chugh

89

Так, є.

Змінна може бути локальною, польовою чи постійною (хоча це технічно неправильно). Це нечіткий атрибут. Крім того, ви повинні знати, що деякі люди люблять називати фіналом нестатичні (локальні або екземпляри) змінні

" Цінності ". Це, ймовірно, походить з мов 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;
    }

}

Є ще багато комбінацій, але мої пальці втомлюються :)


3
@Chris Thompson То, що Eclipse називає це в одному з діалогових вікон. Гей, люди, її Java. Що я можу тобі сказати. Це не має сенсу.
Адам Гент

4
@AdamGent JAVA = Ще одна неясна абревіатура :)
emory

@emory Ну це старий добре відомий оксиморон. Це нічого конкретного для Java, що «проблема» сходить принаймні , C і , ймовірно , більше .. очевидно , ніщо не заважає вам від виклику це просто «константа»
VOO

@AdamGent Не був серйозним, просто дав тобі важкий час ;-)
Кріс Томпсон,

1
Хороше пояснення, насміхаючись з того, як імена ідентифікаторів можуть бути смішно довгими (а вони НЕ отримують смішно довгі часто).
саргаз

5

Якщо ваше запитання було запропоновано користуватися JAXB і хочете вибрати правильне XMLAccessType, у мене було те саме питання. JAXB Javadoc говорить, що "поле" - це нестатична, неперехідна змінна інстанція. "Властивість" має пару getter / setter (тому це має бути приватна змінна). "Громадський член" є публічним, і тому, ймовірно, є постійною. Також у JAXB "атрибут" відноситься до частини елемента XML, як у <myElement myAttribute="first">hello world</myElement>.

Здається, що "властивість" Java в цілому можна визначити як поле з принаймні getter або яким-небудь іншим загальнодоступним методом, який дозволяє отримати його значення. Деякі люди також кажуть, що у власність має бути власниця. Для таких визначень контекст - це все.


5

Dietel і Dietel мають чудовий спосіб пояснення полів і змінних.

"Разом статичні змінні та змінні екземпляри класу відомі як його поля". (Розділ 6.3)

"Змінні повинні бути оголошені полями лише в тому випадку, якщо вони потрібні для використання в більш ніж одному методі класу або якщо програма повинна зберігати свої значення між викликами до методів класу." (Розділ 6.4)

Отже, поля класу - це його статичні або екземплярні змінні - тобто оголошені з областю класу.

Довідка - Dietel P., Dietel, H. - Java ™ Як програмувати (ранні об’єкти), Десяте видання (2014)


3

Якщо ви взяли підказку зі сплячого:

Hibernate читає / записує стан Об'єкта зі своїм полем. Hibernate також відображає властивості стилю Java Bean у схемі DB. 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, але з властивістю ви маєте більше контролю]

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

Java doc каже: Поле - це член даних класу. Поле - нестатична, неперехідна змінна примірник. Поле, як правило, є приватною змінною класу екземпляра.


2

Змінні складаються з полів і не полів.

Поля можуть бути:

  1. Статичні поля або
  2. нестатичні поля, які також називаються екземплярами, наприклад, x = F ()

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

  1. локальні змінні, аналог полів, але всередині методів, а не за межами всіх, або
  2. параметри, наприклад, y у x = f (y)

На закінчення, ключовою відмінністю змінних є те, чи є вони полями чи не полями, тобто чи є вони всередині методу чи поза всіма методами.

Основний приклад (вибачте за мій синтаксис, я лише новачок)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

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

[Змінна Swift, властивість]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.