跳转到内容

POJO

本页使用了标题或全文手工转换
维基百科,自由的百科全书

软件工程里的POJO(plain old Java object),也称为普通老式Java对象纯Java对象一般Java对象,是没有受特殊限制的一般Java对象,这是马丁·福勒(Martin Fowler)、Rebecca Parsons和Josh MacKenzie在2000年9月时所提出[1]

我们一直很疑惑为何人们很抗拒在其系统中使用一般的对象,结论是这类对象缺少了有趣的名字。因此我们就取了名字,如今就很受欢迎…

“POJO”一词一开始是指不依循任何主流Java对象模型、约定或框架的Java对象,和复杂的对象模型相对。

此一词语开启了一连串首字母缩略字,针对不使用先进技术的构造建立返璞词

  • JavaScript里的“普通老式JavaScript对象”(Plain old JavaScript object)[2]
  • Ruby里的“普通老式Ruby对象”(Plain old Ruby object,简称PORO)
  • Perl里的“普通老式文件”(Plain old Documentation,简称pod)
  • .NET框架里的“一般CLR对象”(Plain old CLR object,简称POCO)[3]
  • PHP里的“普通老式PHP对象”(Plain old PHP object,简称POPO[4][5]
  • 电话学里的“普通老式电话服务”(Plain old telephone service,简称POTS)

定义

[编辑]

理想上,POJO是一种只受Java语言规范所限制,此外不受其他限制的Java对象,因此,POJO不应:

  • 继承预定义的类型,像是
import javax.servlet.http.HttpServlet;

public class Foo extends HttpServlet { 
    // ...
}
  • 实现预定义的界面,像是
import javax.ejb.EntityBean;

public class Bar implements EntityBean {
    // ...
}
  • 包括预定义的Java注解(annotations),像是
import javax.persistence.Entity;

@Entity
public class Baz {
    // ...
}

不过,因为技术问题(例如要让持久化正常运作)和其他原因,许多宣称是POJO兼容的软件产品或是框架仍需要用到一些预定义的注解。

POJO的概念是若对象(其实是类别)在加入注解之前是POJO,在移除注解后仍可以视为是POJO。POJO的基本概念是:没有特殊的特征(例如实现特定界面),因此不是“特殊Java对象”(Specialized Java Object)。

不同环境下的定义

[编辑]

JavaBeans

[编辑]

JavaBeans是支持序列化,具有无参构造器英语Nullary constructor,提供getter方法和setter方法访问对象的POJO。因为此命名规则,可以对任意JavaBeans的属性进行简单的宣告式参考。使用这类宣告式参考的代码不需知道有关JavaBean类型的任何信息,JavaBean可以用在许多的框架中,框架不需知道JavaBeans的实际类型。 若要完全实现JavaBeans规范,必须实现序列化界面,因此会稍微打破POJO的规定。因为序列化是标记界面,不需实现任何方法,在代码上的负担很小。

以下是JavaServer Faces(JSF)组件和POJO属性双方绑定的例子:

<h:inputText value="#{MyBean.someProperty}"/>

POJO的定义如下:

public class MyBean {
    private String someProperty;

    public String getSomeProperty() {
         return someProperty;
    }

    public void setSomeProperty(String someProperty) {
        this.someProperty = someProperty;
    }
}

因为JavaBean的命名原则,单一的someProperty参考可以自动翻译成取值的getSomeProperty()方法(或性质是布尔,则是isSomeProperty()方法),以及设定值的setSomeProperty(String)方法。

Project Lombok函数库可以动态改变代码,在不用写这些代码的情形下进行集成。以下的代码会创建相同的JavaBean,再加上空的创建子:

@NoArgsConstructor
public class MyBean {
    @Getter 
    @Setter
    private String someProperty;
}

其他这类命名约定的函数库或是框架会直接产生程序,可减少重复代码(Boilerplate code),也减少了错误的出现率以及维护成本。

透明地增加服务

[编辑]

随着使用POJO的设计越来越普遍,已出现了为POJO提供所有功能,并且可以选择实际需要哪些功能领域的框架。在此模型下,程序设计者创建的就只有POJO。此POJO只专注在业务逻辑,不依赖(企业级)框架。面向切面的程序设计(AOP)框架透明地加入横切关注点,像是持久性(Persistence)、事务处理、安全性等[6]

Spring Framework是很早期实现此概念的框架,也是推广此模型的推进者之一。

以下是一些这类的例子:

以下的例子是一个全功能的EJB bean,说明EJB3如何善用POJO模型的特点:

public class HelloWorldService {

    public String sayHello() {
        return "Hello, world!";
    }
}

在以上的示例中,代码没有延伸任何EJB的类别,或是实现任何EJB的界面,也不需要包括EJB的注解。程序开发者会宣告外部的XML档,说明哪些EJB服务需加在其中:

<enterprise-beans>
    <session>
        <ejb-name>helloWorld</ejb-name>
        <ejb-class>com.example.HelloWorldService</ejb-class>
        <session-type>stateless</session-type>
    </session>
</enterprise-beans>

在实务上,有些人会觉得Java注解比较优雅轻巧,认为XML冗长、丑陋,不容易维护,不过也有人比较在意Java注 解对POJO模型的污染[7]

因此,许多框架(像Spring、EJB和JPA)提供可以不用XML的替代作法,可以不加入XML,改用注解代替。以下程序也是同一个EJB bean,但加入了注解,此例中就不需要XML档了:

@Stateless
public class HelloWorldService {

    public String sayHello() {
        return "Hello, world!";
    }
}

因为有加入注解,此程序已不是真正的纯POJO,不过注解只是被动性的元数据,和侵入式的延伸类别和实现界面来说,注解的缺点要少很多[6]。此程序开发模型仍很像纯POJO模型。

相关首字母缩略字

[编辑]

POJI

[编辑]

POJI(A Plain old Java Interface)是一种基本的Java界面,适用在不允许更复杂Java界面的应用[8]: 57, 572, 576, 579, 1340 

相关条目

[编辑]

参考资料

[编辑]
  1. ^ MF Bliki: POJO. MartinFowler.com. 
  2. ^ Almaer, Dion. Return of the POJO: Plain 'Ole JavaScript. Ajaxian. 2006-07-17 [2014-08-19]. (原始内容存档于2014-09-13). 
  3. ^ POCO Support. microsoft.com. [2012-05-27]. 
  4. ^ Kneschke, Jan. typesafe objects in PHP. kneschke.de. 2007-02-19 [2012-05-27]. (原始内容存档于2012-03-26). 
  5. ^ Cheong, Jym. Controller with bare-bone Plain Old PHP Object aka POPO. jym.sg. 2011-06-26 [2012-05-27]. (原始内容存档于2012-03-26). 
  6. ^ 6.0 6.1 Martin, Robert C; (2008); Clean Code, Chapter 11, Pure Java AOP Frameworks
  7. ^ Panda, Debu; Rahman, Reza; Lane, Derek; (2007). EJB 3 in action, Manning Publications Co., Shelter Island (NY), ISBN 978-1-93-398834-4 (www.manning.com/books/ejb-3-in-action). Chapter 11, Deployment descriptors vs. annotations
  8. ^ Wahli, Ueli; Vieira, Miguel; Gomes, Ferreira Lopes; Hainey, Brian; Moharram, Ahmed; Napoli, JuanPablo; Rohr, Marco; Cui, Henry; Gan, Patrick; Gonzalez, Celso; Ugurlu, Pinar; Ziosi, Lara. Rational Application Developer V7.5 Programming Guide. IBM Redbooks. 29 June 2009. ISBN 978-0738432892.