对各种DTO,VO,POJO等的理解

首先复制一下:

JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。

VO即value object值对象
主要体现在视图的对象,对于一个WEB页面将整个页面的属性封装成一个对象。然后用一个VO对象在控制层与视图层进行传输交换。

DTO (经过处理后的PO,可能增加或者减少PO的属性):
Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。
比如我们一张表有100个字段,那么对应的PO就有100个属性。
但是我们界面上只要显示10个字段,
客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,
这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

POJO(POJO是一种概念或者接口,身份及作用随环境变化而变化) :
POJO有一些private的参数作为对象的属性。然后针对每个参数定义了get和set方法作为访问的接口
plain ordinary java object 简单java对象
即POJO是一个简单的普通的Java对象,它不包含业务逻辑或持久逻辑等,但不是JavaBean、EntityBean等,不具有任何特殊角色和不继承或不实现任何其它Java框架的类或接口。
POJO对象有时也被称为Data对象,大量应用于表现现实中的对象。
一个POJO持久化以后就是PO。
直接用它传递、传递过程中就是DTO
直接用来对应表示层就是VO

概念上的理解就是这样,分层思想是对的,但分层过多往往就会造成理解的问题,各种对象的分类在概念上是对的,然而很多时候很多概念的提出者却没给出相应的实现方案或者指准则,这很多时候就是问题所在;

首先还是对Setter,Gette,构造器,序列化等方法的讨论(我觉得区别就在这里),有句话说得好,你每个属性都给提供getter,setter,那干嘛不一开始直接将属性声明为public,这不是脱裤子放屁么,getter,setter一个读一个写,分工明确;至于构造器,构造器简单分就是有参构造器和无参构造器(这不废话么。。。),但是我觉得这恰恰是理解问题的关键点,你想用好这东西,你得明白他为什么提供给你这个,怎么用好,而不是能用则用(我见过很多瞎写的);

什么时候应该提供无参构造器?

1.当参数值对构建对象不必要的时候,你只要确定了这一条,那么你也该仔细想想你为什么不提供singleton或者protype

2.参数对构建对象很重要,但是往往会有默认值的时候,此时更好的做法是提供工厂方法体现构造类型;

如Excutors框架

有参构造器?

1.参数值或者参数值组对唯一确定一个对象或者对当前对象创建提供必需的初始值是有必要的,必须提供有参构造器

getter.settter

根据封装性,提供了getter,setter之后的对象根本就没有属性封装可言了,一味的提供getter,setter有害无益

作为指导准则,

1.如非必要,请不要提供setter

2.对用于构造参数的属性,尽量不要提供setter

3.setter中不要提供任何其他逻辑代码(值判断等等,setter是最后一层,就是纯赋值),(某些框架提供了@Getter,@Setter注解)

为了加以区分,应用内部提供的按以上标准,可不提供

Serializable

对外传输对象,请考虑实现特殊数据结构,(废除瞎写的getter,setter),并在应用内部跑的pojo提供转化方法

如下实例;

public class User {
    //必须属性
    private int id;
    
    //非必须属性,在设计时尽量仔细考虑应用实际情况;
    private String name;
    private String password;
    
    //禁止无参构造
    private User(){}
    
    
    public User(int id) {
        this.id = id;
    }

    //此类必须属性不提供setter
    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    
    public  UserValueHolder convert(){
        //提供相关方法
        return null;
    }
    
    //VO,DTO等对逻辑基本无关,应尽量隐藏,且命名上应给予相关提示,比如XXXValueHolder
    static class UserValueHolder implements Serializable {
        //提供序列值
        
        int id;
        String name;
        String password;
        
        public User generate(){
            User user = new User(id);
            return user;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/WK_SDU/article/details/82261073