如何创建一个POJO?


68

最近,我开始听说“ POJO”(普通的旧Java对象)。我用谷歌搜索,但仍然不太了解这个概念。谁能给我关于POJO的清晰描述?

考虑带有变量“ id,名称,地址,薪水”的“人员”类-在这种情况下如何创建POJO?代码在POJO下方吗?

public class Person {
    //variables
    People people = new People();
    private int id;
    private String name;
    private String address;
    private int salary;


    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public String getAddress() {
        return address;
    }

    public int getSalary() {
        return salary;
    }

    public void setId() {
        this.id = id;
    }

    public void setName() {
        this.name = name;
    }

    public void setAddress() {
        this.address = address;
    }

    public void setSalary() {
        this.salary = salary;
    }
}

1
查看我对类似问题的回答:stackoverflow.com/questions/3392580/…。这是指POCO(POJOS的.NET版本),但是基本原理是相同的。
RPM1984 '08

@泰米尔语你能再向我解释。关于pojo
Poovizhirajan N

@ Poovizhirajan.N,对不起,谢谢您。莫名其妙地错过了它。

Answers:


81

POJO只是一个普通的,已删除限制的Java Bean。Java Bean必须满足以下要求:

  1. 默认的无参数构造函数
  2. 遵循Bean的getFoo约定(对于布尔变量为isFoo)和setFoo方法来获取名为foo的可变属性;如果foo是不可变的,则忽略setFoo。
  3. 必须实现java.io.Serializable

POJO并没有强制要求任何这些。顾名思义,在JDK下编译的对象可以被视为普通的Java对象。无需应用程序服务器,无需基类,无需使用任何接口。

首字母缩写词POJO是对EJB 2.0的一种反应,它需要多个接口,扩展的基类以及许多用于完成简单操作的方法。其中一些人,Rod Johnson和Martin Fowler,对复杂性表示反感,并寻求一种无需编写EJB即可实现企业级解决方案的方法。

马丁·福勒(Martin Fowler)创造了一个新的缩写。

Rod Johnson撰写了《没有EJB的J2EE》,写了Spring,对EJB的影响足够大,因此3.1版看起来像Spring和Hibernate一样,并且从VMWare获得了不错的IPO。

这是一个示例,您可以将头缠起来:

public class MyFirstPojo
{
    private String name;

    public static void main(String [] args)
    {
       for (String arg : args)
       {
          MyFirstPojo pojo = new MyFirstPojo(arg);  // Here's how you create a POJO
          System.out.println(pojo); 
       }
    }

    public MyFirstPojo(String name)
    {    
        this.name = name;
    }

    public String getName() { return this.name; } 

    public String toString() { return this.name; } 
}

我再也不会有这个疑问了。谢谢。

15
有些人比阅读本书更快地了解了实际演示。我是他们其中的一员。

您的特定示例是不可变的,但其他示例是可变的。您是否只是碰巧使自己变得一成不变?为了封装状态而包含对可变对象的非共享引用的POJO,与为了封装其身份而包含标识其他对象也存在的可变对象的引用的POJO之间是否有区别?
2013年

6
我想我在回答中说过:要求无参数构造函数是Java Bean的要求,但对于POJO则不是。此外,任何规则都可以被打破。了解规则;知道例外;了解后果。这是软件开发,而不是谋杀法庭。
duffymo

1
请再次阅读。Java Bean标准要​​求可序列化;POJO没有。
duffymo '18

28

POJO:POJO是一个Java对象,除了Java语言规范所强加的限制之外,没有任何其他限制。

POJO的性质

  1. 所有属性都必须是公共的setter和getter方法
  2. 所有实例变量应为私有
  3. 不应扩展预定义的类。
  4. 不应实现预定接口。
  5. 不应包含预先指定的注释。
  6. 它可能没有任何参数构造函数

POJO的例子

public class POJO {

    private String value;

    public String getValue() {
         return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

#1,#2与Wikipedia上的定义矛盾。en.wikipedia.org/wiki/Plain_Old_Java_Object#Definition。您正在描述“ JavaBean POJO”(这个词我觉得很矛盾,但这只是我一个词)
Nilzor


4

POJO类充当用于设置和获取值的bean。

public class Data
{


private int id;
    private String deptname;
    private String date;
    private String name;
    private String mdate;
    private String mname;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDeptname() {
        return deptname;
    }

    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMdate() {
        return mdate;
    }

    public void setMdate(String mdate) {
        this.mdate = mdate;
    }

    public String getMname() {
        return mname;
    }

    public void setMname(String mname) {
        this.mname = mname;
    }
}

2

如果您没有做任何使您的类特别为与给定框架,ORM或需要特殊类的系统一起使用而设计的工作,则您将拥有一个普通的Java对象或POJO。

具有讽刺意味的是,创造这个词的原因之一是人们在明智的情况下避免使用它们,有些人认为这是因为他们没有一个好听的名字。具有讽刺意味的是,因为您的问题表明该方法有效。

比较旧的POD“普通旧数据”,就意味着C ++类不会执行C结构无法完成的任何操作(或多或少,不是析构函数或琐碎的构造函数的非虚拟成员不会阻止它执行) (.NET)。


感谢您的答复高级。但是我想要一些实际的解释。

您想对“不特殊”的术语进行实用的解释吗?真?
乔恩·汉纳

2

根据马丁·福勒

这个词是在Rebecca Parsons,Josh MacKenzie和我在2000年9月的一次会议上准备演讲时创造的。在演讲中,我们指出了将业务逻辑编码为常规Java对象而不是使用Entity Beans的许多好处。我们想知道为什么人们反对在他们的系统中使用常规对象,并得出结论,这是因为简单的对象缺少花哨的名称。因此,我们给了他们一个,非常受欢迎。

通常,POJO不受任何限制,任何Java对象都可以称为POJO,但是有一些指导。定义明确的POJO应该遵循以下指示。

  1. POJO中的每个变量都应声明为私有。
  2. 默认构造函数应被公共可访问性覆盖。
  3. 每个变量都应具有可公开访问的Setter-Getter方法。
  4. 通常,POJO应该重写Object的equals(),hashCode()和toString()方法(但这不是强制性的)。
  5. 用于排序的Comparable接口的重写compare()方法(首选,但不是必需的)。

并且根据Java语言规范,POJO不必

  1. 扩展预先指定的课程
  2. 实施预先指定的接口
  3. 包含预先指定的注释

但是,开发人员和框架描述的POJO仍然需要使用预先指定的注释来实现诸如持久性,声明性事务管理等功能。因此,想法是,如果在添加任何注释之前该对象是POJO,则如果注释是删除,则仍可以视为POJO。

JavaBean是一种特殊的POJO,可序列化,具有无参数构造函数,并允许使用遵循简单命名约定的getter和setter方法访问属性。

阅读更多有关Plain Old Java Object(POJO)的说明


但是每个Java类至少都扩展了Object类,而Object类没有扩展任何其他类吗?我们应该添加不能扩展除Object之外的其他类还是不能显式扩展任何类吗?
Badri Paudel

实际上,这些并不是硬性规定,我们也不需要扩展Object,因为它是默认完成的。
Naresh Joshi

1

映射目的主要有三个选项

  1. 连载
  2. XML映射
  3. POJO映射。(普通的旧Java对象)

使用pojo类时,开发人员可以轻松地与数据库进行映射。POJO类是为数据库创建的,同时使用getter和setter方法创建值对象类,可以轻松地保存内容。

因此,出于在Java与数据库之间进行映射的目的,实现了值对象和POJO类。


1
import java.io.Serializable;

public class Course implements Serializable {

    protected int courseId;
    protected String courseName;
    protected String courseType;

    public Course() {
        courseName = new String();
        courseType = new String();
    }

    public Course(String courseName, String courseType) {
        this.courseName = courseName;
        this.courseType = courseType;
    }

    public Course(int courseId, String courseName, String courseType) {
        this.courseId = courseId;
        this.courseName = courseName;
        this.courseType = courseType;
    }

    public int getCourseId() {
        return courseId;
    }

    public void setCourseId(int courseId) {
        this.courseId = courseId;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseType() {
        return courseType;
    }

    public void setCourseType(String courseType) {
        this.courseType = courseType;
    }

    @Override
    public int hashCode() {
        return courseId;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj != null || obj instanceof Course) {
            Course c = (Course) obj;
            if (courseId == c.courseId && courseName.equals(c.courseName)
                    && courseType.equals(c.courseType))
                return true;
        }
        return false;
    }

    @Override
    public String toString() {
        return "Course[" + courseId + "," + courseName + "," + courseType + "]";
    }
}

为什么要使用equals方法?POJO是否也与getter和setter一样?
Rishabh Agarwal

0
public class UserInfo {
        String LoginId;
        String Password;
        String FirstName;
        String LastName;
        String Email;
        String Mobile;
        String Address;
        String DOB;

        public String getLoginId() {
            return LoginId;
        }

        public void setLoginId(String loginId) {
            LoginId = loginId;
        }

        public String getPassword() {
            return Password;
        }

        public void setPassword(String password) {
            Password = password;
        }

        public String getFirstName() {
            return FirstName;
        }

        public void setFirstName(String firstName) {
            FirstName = firstName;
        }

        public String getLastName() {
            return LastName;
        }

        public void setLastName(String lastName) {
            LastName = lastName;
        }

        public String getEmail() {
            return Email;
        }

        public void setEmail(String email) {
            Email = email;
        }

        public String getMobile() {
            return Mobile;
        }

        public void setMobile(String mobile) {
            Mobile = mobile;
        }

        public String getAddress() {
            return Address;
        }

        public void setAddress(String address) {
            Address = address;
        }

        public String getDOB() {
            return DOB;
        }

        public void setDOB(String DOB) {
            this.DOB = DOB;
        }
    }

0
  1. 文件设置插件浏览存储库
  2. 搜索RoboPOJOGenerator并安装,重新启动Android studio
  3. 打开项目,右键单击包,选择从JSON生成POJO
  4. 在对话框中粘贴JSON,然后根据需要选择选项
  5. 单击生成按钮
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.