Sự khác biệt giữa trường, biến, thuộc tính và thuộc tính trong Java POJO là gì?


142

Khi đề cập đến các biến riêng tư nội bộ của Java POJO có getters / setters, tôi đã sử dụng các thuật ngữ sau:

  • cánh đồng
  • Biến đổi
  • thuộc tính
  • bất động sản

Có sự khác biệt nào giữa những điều trên không? Nếu vậy, thuật ngữ chính xác để sử dụng là gì? Có một thuật ngữ khác để sử dụng khi thực thể này vẫn tồn tại?

Câu trả lời:


117

Từ đây: http://docs.oracle.com/javase/tutorial/inif/glossary.html


  • cánh đồng

    • Một thành viên dữ liệu của một lớp. Trừ khi có quy định khác, một trường không tĩnh.

  • bất động sản

    • Đặc điểm của một đối tượng mà người dùng có thể thiết lập, chẳng hạn như màu sắc của cửa sổ.

  • thuộc tính

    • Không được liệt kê trong bảng thuật ngữ trên

  • Biến đổi

    • Một mục dữ liệu được đặt tên bởi một định danh. Mỗi biến có một loại, chẳng hạn như int hoặc Object và một phạm vi. Xem thêm biến lớp, biến thể hiện, biến cục bộ.

27
Tôi vẫn không hiểu sự khác biệt giữa một lĩnh vực và một tài sản?
Koray Tugay

1
@KorayTugay - Hãy xem một trường như một phần dữ liệu thô sơ liên quan đến một đối tượng. Một tài sản (với tôi) là một đặc tính của một vật thể có thể nhìn thấy (và dường như có thể thay đổi) với thế giới bên ngoài.
jahroy

Dựa trên trên, nó sẽ là công bằng khi nói "Properties và các lĩnh vực đều giống nhau, ngoại trừ một tài sản là một settable trường"?
jdurston

2
@ John - Có thể dựa trên những điều trên, như đã lưu ý, là một bản sao / dán từ Oracle. Cá nhân tôi muốn phân biệt rằng một tài sản có thể nhìn thấy công khai và có thể thay đổi, trong khi một trường có thể là một trường riêng, nội bộ chỉ được sử dụng bởi lớp.
jahroy

1
Tôi nghĩ điều tốt nhất để nhấn mạnh là sự tồn tại như một lĩnh vực và một tài sản không loại trừ lẫn nhau. Từ cách trả lời này, cho đến các nhà phát triển mới, nó trông giống như một danh sách những điều khác biệt.
Kartik Chugh

89

Có, có.

Biến có thể là cục bộ, trường hoặc hằng số (mặc dù điều này là sai về mặt kỹ thuật). Nó mơ hồ như thuộc tính. Ngoài ra, bạn nên biết rằng một số người thích gọi các biến không tĩnh (cục bộ hoặc ví dụ) cuối cùng

" Giá trị ". Điều này có lẽ đến từ các ngôn ngữ JVM FP mới nổi như Scala.

Trường nói chung là một biến riêng trên một lớp cá thể. Điều đó không có nghĩa là có một getter và setter.

Thuộc tính là một thuật ngữ mơ hồ. Nó có thể dễ dàng bị nhầm lẫn với API đặt tên XML hoặc Java. Cố gắng tránh sử dụng thuật ngữ đó.

Thuộc tính là sự kết hợp getter và setter.

Một số ví dụ dưới đây

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

}

Có nhiều kết hợp hơn, nhưng ngón tay của tôi đang mệt mỏi :)


3
@Chris Thompson Đó là những gì Eclipse gọi nó trong một trong hộp thoại của nó. Này mọi người, Java của nó. Những gì tôi có thể nói với bạn. Nó không có ý nghĩa.
Adam Gent

4
@AdamGent JAVA = Chỉ là một từ viết tắt mơ hồ :)
emory

@emory Vâng, đó là oxymoron cũ nổi tiếng. Điều đó không có gì cụ thể đối với Java, "vấn đề" đó quay trở lại ít nhất là C và có thể lâu hơn .. rõ ràng không có gì ngăn bạn gọi nó là "hằng số"
Voo

@AdamGent Không nghiêm túc, chỉ khiến bạn gặp khó khăn ;-)
Chris Thompson

1
Giải thích tốt trong khi tạo niềm vui về cách các tên định danh có thể dài một cách lố bịch (và chúng thường bị dài một cách lố bịch).
sargas

5

Nếu câu hỏi của bạn được nhắc bằng cách sử dụng JAXB và muốn chọn đúng XMLAccessType, tôi cũng có câu hỏi tương tự. JAXB Javadoc nói rằng "trường" là một biến đối tượng không tĩnh, không nhất thời. Một "thuộc tính" có một cặp getter / setter (vì vậy nó phải là một biến riêng tư). Một "thành viên công cộng" là công khai, và do đó có lẽ là một hằng số. Cũng trong JAXB, một "thuộc tính" đề cập đến một phần của phần tử XML, như trong <myElement myAttribute="first">hello world</myElement>.

Có vẻ như "tài sản" Java nói chung, có thể được định nghĩa là một trường có ít nhất một getter hoặc một số phương thức công khai khác cho phép bạn nhận được giá trị của nó. Một số người cũng nói rằng một tài sản cần phải có một setter. Đối với các định nghĩa như thế này, bối cảnh là tất cả.


5

Dietel và Dietel có một cách hay để giải thích các trường so với các biến.

Các biến chung và các biến đối tượng của một lớp được gọi là các trường của nó. (Mục 6.3)

Các biến số của Biến chỉ nên được khai báo là các trường nếu chúng được yêu cầu sử dụng cho nhiều hơn một phương thức của lớp hoặc nếu chương trình sẽ lưu các giá trị của chúng giữa các lệnh gọi với các phương thức của lớp. (Mục 6.4)

Vì vậy, các trường của một lớp là các biến tĩnh hoặc thể hiện của nó - tức là được khai báo với phạm vi lớp.

Tham khảo - Dietel P., Dietel, H. - Java ™ Cách lập trình (Đối tượng ban đầu), Phiên bản thứ mười (2014)


3

Nếu bạn lấy manh mối từ Hibernate:

Hibernate đọc / ghi trạng thái của Object với trường của nó. Hibernate cũng ánh xạ các thuộc tính kiểu Java Bean sang DB Schema. Hibernate Truy cập các trường để tải / lưu đối tượng. Nếu ánh xạ được thực hiện bởi thuộc tính, hibernate sử dụng getter và setter.

Đó là Encapsulation phân biệt có nghĩa là nơi bạn có getter / setters cho một trường và nó được gọi là thuộc tính, cùng với đó và chúng ta ẩn cấu trúc dữ liệu cơ bản của thuộc tính đó trong setMethod, chúng ta có thể ngăn chặn sự thay đổi không mong muốn bên trong setters. Tất cả những gì đóng gói là viết tắt của ...

Các trường phải được khai báo và khởi tạo trước khi chúng được sử dụng. Chủ yếu là để sử dụng nội bộ lớp.

Các thuộc tính có thể được thay đổi bởi setter và chúng được hiển thị bởi getters. Ở đây giá trường có getter / setters vì vậy nó là tài sản.

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

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

Tương tự sử dụng các trường , [Trong chế độ ngủ đông, đó là cách được đề xuất cho MAP bằng cách sử dụng các trường, trong đó id int id; được chú thích @Id, nhưng với Tài sản bạn có nhiều quyền kiểm soát hơn]

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

Tài liệu Java nói: Trường là thành viên dữ liệu của một lớp. Một trường là không tĩnh, biến đối tượng không thoáng qua. Trường nói chung là một biến riêng trên một lớp cá thể.


2

Các biến bao gồm các trường và phi trường.

Các lĩnh vực có thể là:

  1. Trường tĩnh hoặc
  2. Các trường không tĩnh cũng được gọi là tức thời, ví dụ x = F ()

Không phải trường có thể là:

  1. các biến cục bộ, tương tự của các trường nhưng bên trong một phương thức chứ không phải bên ngoài tất cả chúng, hoặc
  2. tham số ví dụ y trong x = f (y)

Tóm lại, sự khác biệt chính giữa các biến là chúng là trường hay không phải trường, nghĩa là chúng nằm trong một phương thức hay bên ngoài tất cả các phương thức.

Ví dụ cơ bản (xin lỗi cho cú pháp của tôi, tôi chỉ là người mới bắt đầu)

Class {    
    //fields    

    method1 {              
         //non-fields    

    }    
}

1

Trên thực tế hai thuật ngữ này thường được sử dụng để đại diện cho cùng một điều, nhưng có một số tình huống đặc biệt. Một trường có thể lưu trữ trạng thái của một đối tượng. Ngoài ra tất cả các lĩnh vực là các biến. Vì vậy, rõ ràng có thể có các biến không phải là các trường. Vì vậy, nhìn vào 4 loại biến (biến lớp, biến thể hiện, biến cục bộ và biến tham số) chúng ta có thể thấy rằng các biến lớp và biến thể hiện có thể ảnh hưởng đến trạng thái của một đối tượng. Nói cách khác, nếu một lớp hoặc biến thể hiện thay đổi, trạng thái của đối tượng thay đổi. Vì vậy, chúng ta có thể nói rằng các biến lớp và biến thể hiện là các trường trong khi các biến cục bộ và biến tham số thì không.

Nếu bạn muốn hiểu sâu hơn, bạn có thể đi đến nguồn dưới đây: -

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


0

Câu hỏi đã cũ nhưng một sự khác biệt quan trọng khác giữa một biến và một trường là một trường có giá trị mặc định khi nó được khai báo. Mặt khác, biến phải được khởi tạo.


Làm thế nào về một tài sản?
Koray Tugay

0

Sự hiểu biết của tôi là như dưới đây, và tôi không nói rằng điều này đúng 100%, tôi cũng có thể bị nhầm lẫn ..

Một biến là một cái gì đó mà bạn khai báo, có thể thay đổi theo mặc định và có các giá trị khác nhau, nhưng điều đó cũng có thể được nói rõ ràng là cuối cùng. Trong Java đó sẽ là:

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

Về cơ bản, một biến là bất cứ thứ gì được khai báo và có thể chứa các giá trị. Phương thức foo ở trên trả về một biến chẳng hạn .. Nó trả về một biến kiểu Integer chứa địa chỉ bộ nhớ của Integer () mới; Mọi thứ khác bạn thấy ở trên cũng là các biến, listVariable, aFinalVariableExample và được giải thích ở đây:

Một trường là một biến trong đó phạm vi rõ ràng hơn (hoặc cụ thể). Biến trả về từ phạm vi của phương thức foo không rõ ràng trong ví dụ trên, vì vậy tôi sẽ không gọi nó là một trường. Mặt khác, iAmAlsoVariable là trường "cục bộ", bị giới hạn bởi phạm vi của phương thức foo và listVariable là trường "thể hiện" trong đó phạm vi của trường (biến) bị giới hạn bởi phạm vi đối tượng.

Một tài sản là một lĩnh vực có thể được truy cập / đột biến. Bất kỳ trường nào hiển thị getter / setter đều là thuộc tính.

Tôi không biết về thuộc tính và tôi cũng muốn nhắc lại rằng đây là sự hiểu biết của tôi về các biến, trường và thuộc tính là gì.


0
  • variable- địa chỉ lưu trữ được đặt tên. Mỗi biến có một loại xác định kích thước bộ nhớ, thuộc tính và hành vi. Có cho loại biến Java: class variable, instance variable, local variable,method parameter
//pattern
<Java_type> <name> ;

//for example
int myInt;
String myString;
CustomClass myCustomClass;
  • field- biến thành viên hoặc dữ liệu thành viên. Nó là một variablebên trong một class( class variablehoặc instance variable)

  • attribute- trong một số bài viết bạn có thể thấy rằng attributenó là một objectđại diện của class variable. Objecthoạt động theo attributesđó xác định một tập hợp các đặc điểm.

CustomClass myCustomClass = new CustomClass();
myCustomClass.something = "poor fantasy"; //something is an attribute of myCustomClass object with a "poor fantasy" value
  • property- field+ giới hạn getter/setter. Nó có một cú pháp trường nhưng sử dụng các phương thức dưới mui xe. Javakhông hỗ trợ nó ở dạng tinh khiết. Hãy xem Objective-C, Swift,Kotlin

Ví dụ Kotlinmẫu:

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

[Biến Swift, thuộc tính]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.