【问题标题】:How to create a POJO?如何创建 POJO?
【发布时间】:2011-04-01 10:24:14
【问题描述】:

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

考虑一个带有变量“id、name、address、salary”的类“Person”——我将如何为这种情况创建一个 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;
    }
}

【问题讨论】:

  • 查看我对类似问题的回答:stackoverflow.com/questions/3392580/…。这里指的是 POCO 的(.NET 版本的 POJOS),但基本原理是一样的。
  • @Tamil 你能再给我解释一下吗?关于pojo
  • @Poovizhirajan.N,很抱歉耽搁了这么久。不知何故错过了。

标签: java pojo


【解决方案1】:

POJO 是 Plain Old Java Object

来自我链接到的维基百科文章:

在计算软件中,POJO 是一种 普通旧 Java 对象的首字母缩写词。这 名称用于强调给定的 object 是一个普通的 Java 对象,而不是 一个特殊的对象,特别是 不是Enterprise JavaBean

您的班级似乎已经是 POJO。

【讨论】:

    【解决方案2】:

    当您没有做任何事情来使您的类特别设计为与给定框架、ORM 或其他需要特殊类的系统一起使用时,您就有了一个普通的旧 Java 对象或 POJO。

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

    比较旧的 POD “Plain Old Data” 来表示一个 C++ 类,它不做 C 结构不能做的任何事情(或多或少,不是析构函数或普通构造函数的非虚拟成员不不要将其视为 POD),以及 .NET 中更新的(更直接可比的)POCO“Plain Old CLR Object”。

    【讨论】:

    • 感谢前辈的回复。但我想要一些实际的解释。
    • 您想要对“不特殊”的命名法进行实用的解释吗?真的吗?
    【解决方案3】:

    POJO 只是一个简单的、旧的 Java Bean,已删除了限制。 Java Bean 必须满足以下要求:

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

    POJO 不强制要求任何这些。顾名思义:在JDK下编译的对象可以被认为是Plain Old Java Object。没有应用服务器,没有基类,不需要使用接口。

    首字母缩略词 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; } 
    }
    

    【讨论】:

    • 我再也不会有这种怀疑了。谢谢。
    • 有些人可以比阅读更快地理解实际演示。我就是其中之一。
    • 您的特定示例是不可变的,但其他示例是可变的。你只是碰巧让你的不可变吗?包含对可变对象的非共享引用以封装其状态的 POJO 与包含标识可变对象的引用(其他引用也存在于其中以封装其身份)的 POJO 之间是否有任何区别?
    • 我想我在回答中已经说过了:需要一个无参数的构造函数是 Java Bean 的要求,但对于 POJO 则不然。此外,any 规则可以被打破。了解规则;了解例外情况;了解后果。这是软件开发,而不是谋杀法庭。
    • 请再读一遍。 Java Bean 标准要求 Serialiable; POJO 没有。
    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      【解决方案6】:

      主要有三个选项可以用于映射目的

      1. 序列化
      2. XML 映射
      3. POJO 映射。(普通旧 Java 对象)

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

      因此,为了实现java与数据库之间的映射,实现了值对象和POJO类。

      【讨论】:

        【解决方案7】:
        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一样吗?
        【解决方案8】:
        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;
                }
            }
        

        【讨论】:

          【解决方案9】:

          根据Martin Fowler

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

          通常,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) Explained

          【讨论】:

          • 但是每个 Java 类至少都扩展了 Object 类而不扩展任何其他类?我们应该添加不能扩展除 Object 之外的其他类还是不能显式扩展任何类?
          • 其实这些并不是硬性规定,我们也不需要扩展 Object,因为它是默认完成的。
          【解决方案10】:
          1. 文件设置插件-浏览存储库
          2. 搜索 RoboPOJOGenerator 并安装,重启 Android studio
          3. 打开项目并右键单击从 JSON 生成 POJO 上的包选择
          4. 在对话框中粘贴 JSON 并根据您的要求选择选项
          5. 点击生成按钮

          【讨论】:

            【解决方案11】:

            如果一个类没有框架陷入,那么从该类创建的对象被识别为POJO。

            让我们看一些例子:

            class MyServlet extends HttpServlet{
                //....
            }
            

            MyServlet 类的唯一含义由 HttpServlet 类给出。因此,从 MyServlet 创建的对象不是 POJO

            class MyClass implements Serializable{
                //...
            }
            

            Serializable 接口没有给 MyClass 类赋予意义。因此,从 MyClass 创建的对象是 POJO

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-10-30
              • 1970-01-01
              • 2012-12-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多