0

我使用 DAO MVC,经过一番谷歌搜索后,我考虑将一些变量存储为java 中的 EnumMySQL 中的 String。所以我在 Item.java 中创建(将持久化到 Item 表中)静态初始化和静态方法将 Enum 转换为 String,反之亦然。但是有人说我在这个静态初始化和静态方法之后,我的 Item.java 类变成了 NOT POJO。

问题

  1. 为什么它变成了 NOT POJO?
  2. 如果我让那些方法不是静态的 Item.java 类将是 POJO?

编辑:我的代码:

package model;

import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

public class Order {

    public enum OrderStatus {
        NOT_REVIEWED,
        APPROVED,
        REJECTED,
        RETURNED
    } 

    // ==================
    // =   Transient    = 
    // ==================
    private static final Map<String, OrderStatus> convertStringToOrderStatusMap = new HashMap<String, OrderStatus>(3);
    private static final Map<OrderStatus, String> convertOrderStatusToStringMap = new EnumMap<OrderStatus, String>(OrderStatus.class);

    static {
        convertStringToOrderStatusMap.put("not reviewed", OrderStatus.NOT_REVIEWED);
        convertStringToOrderStatusMap.put("approved", OrderStatus.APPROVED);
        convertStringToOrderStatusMap.put("rejected", OrderStatus.REJECTED);
        convertStringToOrderStatusMap.put("returned", OrderStatus.RETURNED);
        convertOrderStatusToStringMap.put(OrderStatus.NOT_REVIEWED, "not reviewed");
        convertOrderStatusToStringMap.put(OrderStatus.APPROVED, "approved");
        convertOrderStatusToStringMap.put(OrderStatus.REJECTED, "rejected");
        convertOrderStatusToStringMap.put(OrderStatus.RETURNED, "returned");
    }
    // ==================
    // =   Attributes   = 
    // ==================
    private Integer orderId; //Primary key
    private OrderStatus status;
    private Integer reimbursement;
    private String firstName;
    private String secondName;
    private String passportData;
    private String pickUpDate; 
    private String dropOffDate;
    //java.util.Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2011-05-18 16:29:31");
    private String customerCell;
    private String customerAddress;

    // ==================
    // =  Foreign Keys  = 
    // ==================
    private User user;
    private Car car;

    // ==================
    // = Public methods = 
    // ==================

    public Integer getOrderId() {
        return orderId;
    }

    public void setOrderId(Integer orderId) {
        this.orderId = orderId;
    }

    public String getStatus() {
        return convertOrderStatusToString(status);
    }
    public void setStatus(OrderStatus status) {
        this.status = status;
    }

    public Integer getReimbursement() {
        return this.reimbursement;
    }

    public void setReimbursement(Integer value) {
        this.reimbursement = value;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    public String getPassportData() {
        return passportData;
    }

    public void setPassportData(String passportData) {
        this.passportData = passportData;
    }

    public String getPickUpDate() {
        return pickUpDate;
    }

    public void setPickUpDate(String pickUpDate) {
        this.pickUpDate = pickUpDate;
    }

    public String getDropOffDate() {
        return dropOffDate;
    }

    public void setDropOffDate(String dropOffDate) {
        this.dropOffDate = dropOffDate;
    }

    public String getCustomerCell() {
        return customerCell;
    }

    public void setCustomerCell(String customerCell) {
        this.customerCell = customerCell;
    }

    public String getCustomerAddress() {
        return customerAddress;
    }

    public void setCustomerAddress(String customerAddress) {
        this.customerAddress = customerAddress;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public static OrderStatus converStringToOrderStatus(String status) {
        return convertStringToOrderStatusMap.get(status);
    }

    public static String convertOrderStatusToString(OrderStatus status) {
        return convertOrderStatusToStringMap.get(status);
    }
}
4

2 回答 2

0

因为一个Plain Old J ava O对象只有数据。添加逻辑和方法意味着它不再是普通的旧 Java 对象。

这并不一定会使它成为一件坏事,但您也许可以将逻辑重构为它自己的类。

于 2013-04-09T18:55:19.683 回答
0

让我们忽略 POJO。

他们的意思是面向服务与领域驱动。

面向服务遵循严格的行为与状态分离。他们将 POJO 称为数据对象,这些数据对象本质上是美化的结构。因此,您可以将静态方法放在服务中。事实上,您甚至可能不希望方法是静态的,因为这也违反了面向服务的方法(请参阅依赖注入和邪恶的单例)。

Domain Driven 遵循经典 OOP(例如 Rails Active Record)的理念,他们相信在他们的 POJO 中放置行为是可以的。因此,由于状态+行为是耦合的,因此只有一种实现,因此域对象中的静态方法是可以的。

如果你走 DAO 路线,你最有可能做的是面向服务的。我的意见是,如果您要执行 DAO POJO 路线,您应该为这些数据对象使用不可变对象(无耻插件)

据我所知,最后将内联enum放入一个类中并不违反 POJO 的任何定义。@Enumerated话虽这么说,自从您使用 JPA 以来,您应该知道这一点。

于 2013-04-09T19:05:38.970 回答