Câu hỏi JavaBean chính xác là gì?


Tôi hiểu, tôi nghĩ rằng, một "Bean" là một lớp Java với các thuộc tính và getters / setters. Theo tôi hiểu, nó tương đương với cấu trúc C. Điều đó có đúng không?

Ngoài ra, có một thực tế cú pháp khác biệt giữa một loại đậu và một lớp học bình thường? Có định nghĩa đặc biệt hay giao diện nào không?

Về cơ bản, tại sao có một thuật ngữ cho điều này?

Chỉnh sửa: Nếu bạn có thể tử tế và thêm thông tin liên quan đến Serializable giao diện, và nó có ý nghĩa gì, với câu trả lời của bạn, tôi sẽ rất biết ơn.


1363
2017-07-21 00:41


gốc


Xem nơi đậu Java được sử dụng?. Đó là một lớp học theo các quy ước nhất định. - Matthew Flaschen
Tôi nghĩ rằng nó là viết tắt của "khép kín" - Val
Vì lợi ích của sự hoàn chỉnh, đây là một liên kết đến Đặc tả JavaBeans. - informatik01
có thể trùng lặp "Java Bean" là gì? - KNU


Các câu trả lời:


JavaBean chỉ là một Tiêu chuẩn

  1. Tất cả các thuộc tính riêng tư (sử dụng getters / setters)
  2. Công khai -bộ tạo không đối số
  3. Dụng cụ Serializable.

Đó là nó. Nó chỉ là một quy ước. Rất nhiều thư viện phụ thuộc vào nó.

Đối với Serializable, từ Tài liệu API:

Khả năng nối tiếp của một lớp được kích hoạt bởi lớp thực hiện   giao diện java.io.Serializable. Các lớp không thực hiện điều này   giao diện sẽ không có bất kỳ trạng thái được tuần tự hóa hoặc deserialized của họ.   Tất cả các kiểu con của một lớp tuần tự được tự tuần tự hóa. Các   giao diện tuần tự hóa không có phương thức hoặc trường và chỉ phục vụ   xác định ngữ nghĩa của việc tuần tự hóa.

Nói cách khác, các đối tượng tuần tự có thể được ghi vào luồng, và do đó các tệp, cơ sở dữ liệu đối tượng, bất kỳ thứ gì thực sự.

Ngoài ra, không có sự khác biệt về cú pháp giữa một JavaBean và một lớp khác - một lớp định nghĩa một JavaBean nếu nó tuân theo các tiêu chuẩn.

Có một thuật ngữ cho nó vì tiêu chuẩn cho phép các thư viện lập trình làm những việc với các cá thể lớp mà bạn định nghĩa theo một cách được xác định trước. Ví dụ, nếu một thư viện muốn truyền bất kỳ đối tượng nào mà bạn truyền vào nó, nó biết nó có thể vì đối tượng của bạn được tuần tự hóa (giả sử lib yêu cầu đối tượng của bạn là JavaBeans thích hợp).


1501
2017-07-21 00:45



Đúng vậy, theo ý kiến ​​của tôi, hầu như tất cả các tài liệu xoay quanh đậu đều không thể mô tả ngắn gọn như bạn có. +1 - AndaP
Có cần thiết cho các thành viên của một hạt đậu cũng không? Có vẻ như một yêu cầu hợp lý .. - worldsayshi
@worldsayshi - Không, không cần thiết. Ví dụ một bean có thể chứa một String; và String không phải là một bean. (String là bất biến, vì vậy bạn không thể tạo nó bằng cách gọi một constructor rỗng và một setter.) Có vẻ hợp lý rằng một đối tượng Serializable nên có các thành viên Serializable, trừ khi nó bằng cách nào đó serializes chúng từ bên ngoài. Vì vậy, không, các thành viên Java bean không cần phải có bất kỳ khía cạnh nào của các hạt Java. Mặc dù nó là nhiều hơn đơn giản nếu họ là đậu, quá. - Viliam Búr
Vì vậy, đậu về cơ bản POJOs sau đây đã đề cập ba tiêu chuẩn? - KNU
"Tất cả các thuộc tính riêng tư" đều không chính xác. Các thuộc tính được suy ra từ các getters và setters (nếu có một phương thức X getFoo () -> bean có một thuộc tính có thể đọc được gọi là "foo", nếu có phương thức setFoo (X foo) -> bean có một thuộc tính có thể ghi được gọi là "foo"). Thuộc tính có thể được hỗ trợ bởi các trường thành viên (nhưng không nhất thiết phải là) thường là riêng tư. - Puce


Có một thuật ngữ cho nó để làm cho nó âm thanh đặc biệt. Thực tế là hư không gần như vậy bí ẩn.

Về cơ bản, một "Bean":

  • là một đối tượng có thể tuần tự hóa (nghĩa là, nó thực hiện java.io.Serializablevà thực hiện chính xác),
  • có "thuộc tính" có getters và setters chỉ là các phương thức với một số tên (ví dụ như, getFoo() là getter cho thuộc tính "Foo") và
  • có một hàm tạo mặc định công cộng (vì vậy nó có thể được tạo theo ý muốn và được cấu hình bằng cách thiết lập các thuộc tính của nó).

Cập nhật:

Như cho Serializable: Đó không là gì ngoài "giao diện điểm đánh dấu" (một giao diện không khai báo bất kỳ hàm nào) cho Java biết rằng lớp thực thi đồng ý (và ngụ ý rằng nó có khả năng) "tuần tự hóa" - một quá trình chuyển đổi một cá thể vào một luồng byte. Các byte đó có thể được lưu trữ trong các tệp, được gửi qua kết nối mạng, v.v và có đủ thông tin để cho phép một JVM (ít nhất, một cái biết về kiểu của đối tượng) để tái tạo lại đối tượng sau này - có thể trong một thể hiện khác của ứng dụng hoặc thậm chí trên toàn bộ máy khác!

Tất nhiên, để làm được điều đó, lớp học phải tuân theo những hạn chế nhất định. Trưởng trong số đó là tất cả các trường thể hiện phải là các kiểu nguyên thủy (int, bool, v.v.), các cá thể của một số lớp cũng có thể tuần tự hóa hoặc được đánh dấu là transient để Java không cố gắng đưa chúng vào. (Điều này tất nhiên có nghĩa là transient các trường sẽ không tồn tại trong chuyến đi qua luồng. Một lớp học có transient các trường cần được chuẩn bị để khởi tạo lại chúng nếu cần.)

Một lớp không thể tuân theo những giới hạn đó không nên thực hiện Serializable (và, IIRC, trình biên dịch Java sẽ không để cho nó làm như vậy.)


242
2017-07-21 00:50



Đây có lẽ là một câu hỏi ngu ngốc, nhưng trường có thể là gì ngoài một kiểu nguyên thủy hoặc một thể hiện của một lớp? - kingfrito_5005
@ kingfrito_5005: Nó sẽ là một hoặc khác. Nhưng nếu nó là một thể hiện của một lớp, nó quan trọng cho dù lớp đó là serializable hay không. Để cho một lớp được serializable, nó khôngtransient các bộ phận phải thuộc một số loại có thể tuần tự hóa. - cHao


JavaBeans là các lớp Java tuân thủ một quy ước mã hóa cực kỳ đơn giản. Tất cả những gì bạn phải làm là

  1. Thực hiện giao diện java.io.Serializable - Để lưu trạng thái của một vật
  2. sử dụng một hàm tạo đối số rỗng công khai - Để khởi tạo đối tượng
  3. Và cung cấp các phương thức getter và setter công cộng - Để nhận và thiết lập các giá trị của biến private (thuộc tính).

79
2017-07-21 04:22





Thuộc tính của JavaBeans

JavaBean là một đối tượng Java đáp ứng các quy ước lập trình nhất định:

  1. Lớp JavaBean phải triển khai Serializable hoặc là Externalizable 

  2. Lớp JavaBean phải có một hàm tạo no-arg

  3. Tất cả các thuộc tính JavaBean phải có phương thức setter và getter công cộng

  4. Tất cả các biến cá thể JavaBean phải là riêng tư

Ví dụ về JavaBeans

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

48
2018-01-24 09:33



Các chú thích có cần thiết hay một phần của Java Bean không? - giannis christofakis
@giannischristofakis Không, các chú thích là không cần thiết. Các chú thích được sử dụng một phần của Spring Framework, sử dụng Java Beans rộng rãi. - Tianxiang Xiong
Tại sao nó cần phải có một constructor no-arg? - Renato
@Renato này rất đơn giản. suy nghĩ về mùa xuân mà phải tự động khởi tạo đậu của bạn với arg-constructor ... nó sẽ vượt qua những gì là đối số? ;) - Alex75


Hạt Java đang sử dụng ít mã hơn và tiếp cận công việc hơn ... Hạt Java được sử dụng trong Java EE như một hợp đồng toàn cầu cho việc khám phá và truy cập thời gian chạy. Ví dụ, JavaServer Pages (JSP) sử dụng Java Beans như các đối tượng truyền dữ liệu giữa các trang hoặc giữa các servlet và JSP. Khung công tác JavaBeans của Java EE sử dụng Java Beans để tích hợp hỗ trợ cho các kiểu dữ liệu MIME vào Java EE. API quản lý Java EE sử dụng JavaBeans làm nền tảng cho việc thiết lập các tài nguyên được quản lý trong môi trường Java EE.

Giới thiệu về Serialization:

Trong serialization đối tượng, một đối tượng có thể được biểu diễn dưới dạng một chuỗi các byte bao gồm dữ liệu của đối tượng cũng như thông tin về kiểu của đối tượng và các kiểu dữ liệu được lưu trữ trong đối tượng.

Sau khi một đối tượng tuần tự được ghi vào một tệp, nó có thể được đọc từ tệp và được deserialized, thông tin kiểu và byte đại diện cho đối tượng và dữ liệu của nó có thể được sử dụng để tạo lại đối tượng trong bộ nhớ.


18
2017-09-23 07:30





Bạn sẽ thấy Serialization hữu ích khi triển khai dự án của bạn trên nhiều máy chủ vì các bean sẽ được lưu giữ và chuyển qua chúng.


17
2017-07-21 06:03



Bạn có thể vui lòng cung cấp thêm thông tin về việc triển khai dự án trên nhiều máy chủ không? cảm ơn bạn - Hanfeng
nói một cụm với một vài máy chủ, cho Websphere liên kết này stackoverflow.com/questions/3193345/… có thể giúp. - Truong Ha


Giải thích với một ví dụ.

1. import java.io.Serializable

Đối với Serialization, xem tài liệu.

2. các trường riêng

Các trường phải riêng tư để ngăn các lớp bên ngoài dễ dàng sửa đổi các trường đó. Thay vì trực tiếp accesing cho những lĩnh vực, usteragly getter / setter phương pháp được sử dụng.

3. Constructor

Một nhà xây dựng công cộng mà không có bất kỳ đối số.

4. getter / setter

Phương pháp Getter và setter cho accesing private fields.

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = is;
    }
    public void setName(String name) {
        this.name = name;
    }
}

16
2017-08-22 12:45





Theo Wikipedia:

  1. Lớp phải có một hàm tạo mặc định công cộng (không có đối số). Điều này cho phép dễ dàng khởi tạo trong các khung chỉnh sửa và kích hoạt.

  2. Các thuộc tính lớp phải có thể truy cập bằng cách sử dụng get, set, là (có thể được sử dụng cho các thuộc tính boolean thay vì nhận) và các phương thức khác (gọi là phương thức accessor và các phương thức mutator) theo quy ước đặt tên tiêu chuẩn. Điều này cho phép dễ dàng kiểm tra tự động và cập nhật trạng thái đậu trong các khuôn khổ, nhiều trong số đó bao gồm các trình chỉnh sửa tùy chỉnh cho các loại thuộc tính khác nhau. Người định cư có thể có một hoặc nhiều đối số.

  3. Lớp nên được tuần tự hóa. [Điều này cho phép các ứng dụng và khung công tác tiết kiệm đáng kể, lưu trữ và khôi phục trạng thái của bean theo cách độc lập với máy ảo và nền tảng.]

Để biết thêm thông tin, hãy làm theo liên kết.


9
2018-06-16 11:41





Hạt Java là một tiêu chuẩn, và các yêu cầu cú pháp cơ bản của nó đã được giải thích rõ ràng bằng các câu trả lời khác.

Tuy nhiên, IMO, nó không chỉ là một tiêu chuẩn cú pháp đơn giản. Ý nghĩa thực sự hoặc mục đích sử dụng của Java Beans là, cùng với các công cụ hỗ trợ khác nhau xung quanh tiêu chuẩn, để tạo điều kiện sử dụng lại mã và kỹ thuật phần mềm dựa trên thành phần, cho phép các nhà phát triển xây dựng ứng dụng bằng cách lắp ráp các thành phần hiện có (lớp) và không cần phải viết mã (hoặc chỉ phải viết một mã keo nhỏ). Thật không may công nghệ này là cách theo ước tính và không được sử dụng bởi ngành công nghiệp, có thể được kể từ các câu trả lời trong chủ đề này.

Nếu bạn đọc Oracle hướng dẫn về đậu Java, bạn có thể hiểu rõ hơn về điều đó.


8
2018-05-21 15:11



Bài đăng và liên kết hữu ích. Khi tôi nghĩ về đậu tôi thực sự nghĩ rằng điều của "Visual Builder" loại công cụ, như minh họa trong bài viết Oracle. Tôi tự hỏi liệu có nhiều khung công tác khác sử dụng chúng theo cách lớn ... - mike rodent