📜  POJO 与Java Bean

📅  最后修改于: 2022-05-13 01:54:35.640000             🧑  作者: Mango

POJO 与Java Bean

POJO 类

POJO 代表普通旧Java对象。它是一个普通的Java对象,除了Java语言规范强制的限制之外,不受任何特殊限制的约束,并且不需要任何类路径。 POJO 用于提高程序的可读性和可重用性。 POJO 获得了最多的认可,因为它们易于编写和理解。它们是由 Sun microsystems 在 EJB 3.0 中引入的。

POJO 不应:

  1. 扩展预先指定的类,例如:public class GFG extends javax.servlet.http.HttpServlet { ... }不是POJO 类。
  2. 实现预先指定的接口,例如:public class Bar implements javax.ejb.EntityBean { ... }不是POJO 类。
  3. 包含预先指定的注释,例如:@javax.persistence.Entity public class Baz { ... }不是POJO 类。

POJO 基本上定义了一个实体。就像在你的程序中一样,如果你想要一个 Employee 类,那么你可以创建一个 POJO,如下所示:

Java
// Employee POJO class to represent entity Employee
public class Employee
{
    // default field
    String name;
  
    // public field
    public String id;
  
    // private salary
    private double salary;
  
    //arg-constructor to initialize fields
    public Employee(String name, String id, 
                             double salary)
    {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }
  
    // getter method for name
    public String getName()
    {
        return name;
    }
  
    // getter method for id
    public String getId()
    {
        return id;
    }
  
    // getter method for salary
    public Double getSalary()
    {
        return salary;
    }
}


Java
// Java program to illustrate JavaBeans 
class Bean 
{ 
    // private field property 
    private Integer property; 
    Bean() 
    { 
        // No-arg constructor 
    } 
    
    // setter method for property 
    public void setProperty(Integer property) 
    { 
        if (property == 0) 
        { 
            // if property is 0 return 
            return; 
        } 
        this.property=property; 
    } 
    
    // getter method for property 
    public Integer getProperty() 
    { 
        if (property == 0) 
        { 
            // if property is 0 return null 
            return null; 
        } 
        return property; 
    } 
} 
    
// Class to test above bean 
public class GFG 
{ 
    public static void main(String[] args) 
    { 
        Bean bean = new Bean(); 
    
        bean.setProperty(0); 
        System.out.println("After setting to 0: " + 
                                 bean.getProperty()); 
    
        bean.setProperty(5); 
        System.out.println("After setting to valid" + 
                      " value: " + bean.getProperty()); 
    } 
}


上面的例子是一个定义良好的 POJO 类的例子。如您所见,字段的访问修饰符没有限制。它们可以是私有的、默认的、受保护的或公共的。也没有必要在其中包含任何构造函数。
POJO 是一个封装业务逻辑的对象。下图显示了 POJO 类的工作示例。控制器与您的业务逻辑交互,后者又与 POJO 交互以访问数据库。在此示例中,数据库实体由 POJO 表示。此 POJO 具有与数据库实体相同的成员。

pojo_bean

Java Bean

豆子是一种特殊的Pojos。 POJO 成为 bean 有一些限制。

  1. 所有 JavaBean 都是 POJO,但并非所有 POJO 都是 JavaBean。
  2. 可序列化,即它们应该实现可序列化接口。尽管如此,一些没有实现 Serializable 接口的 POJO 被称为 POJO,因为 Serializable 是一个标记接口,因此没有太多负担。
  3. 字段应该是私有的。这是为了提供对字段的完全控制。
  4. 字段应该有 getter 或 setter 或两者兼有。
  5. bean 中应该有一个无参数的构造函数。
  6. 字段只能由构造函数或 getter 设置器访问。

根据字段名称,Getter 和 Setter 有一些特殊的名称。例如,如果字段名称是 someProperty,那么它的getter最好是:

public "returnType" getSomeProperty()
{
   return someProperty;
} 

二传手将是

public void setSomePRoperty(someProperty)
{
   this.someProperty=someProperty;
}

getter 和 setter 的可见性通常是公开的。 Getter 和 setter 提供了对字段的完整限制。例如考虑下面的属性,

Integer age;

如果您将年龄的可见性设置为公众,那么任何对象都可以使用它。假设您希望年龄不能为 0。在这种情况下,您无法控制。任何对象都可以将其设置为 0。但是通过使用 setter 方法,您可以进行控制。你可以在你的 setter 方法中有一个条件。同样,对于 getter 方法,如果您希望如果您的年龄为 0 则它应该返回 null,您可以使用 getter 方法来实现这一点,如下例所示:

Java

// Java program to illustrate JavaBeans 
class Bean 
{ 
    // private field property 
    private Integer property; 
    Bean() 
    { 
        // No-arg constructor 
    } 
    
    // setter method for property 
    public void setProperty(Integer property) 
    { 
        if (property == 0) 
        { 
            // if property is 0 return 
            return; 
        } 
        this.property=property; 
    } 
    
    // getter method for property 
    public Integer getProperty() 
    { 
        if (property == 0) 
        { 
            // if property is 0 return null 
            return null; 
        } 
        return property; 
    } 
} 
    
// Class to test above bean 
public class GFG 
{ 
    public static void main(String[] args) 
    { 
        Bean bean = new Bean(); 
    
        bean.setProperty(0); 
        System.out.println("After setting to 0: " + 
                                 bean.getProperty()); 
    
        bean.setProperty(5); 
        System.out.println("After setting to valid" + 
                      " value: " + bean.getProperty()); 
    } 
}

输出:-

After setting to 0: null
After setting to valid value: 5

POJO 与Java Bean

POJO

Java Bean

It doesn’t have special restrictions other than those forced by Java language.It is a special POJO which have some restrictions.
It doesn’t provide much control on members.It provides complete control on members.
It can implement Serializable interface.It should implement serializable interface.
Fields can be accessed by their names.Fields are accessed only by getters and setters.
Fields can have any visibility.Fields have only private visibility.
There may/may-not be a no-arg constructor.It must have a no-arg constructor.
It is used when you don’t want to give restriction on your members and give user complete access of your entityIt is used when you want to provide user your entity but only some part of your entity.

结论

POJO 类和 Bean 都用于定义Java对象以增加它们的可读性和可重用性。 POJO 没有其他限制,而 bean 是具有一些限制的特殊 POJO。