在POJO Getter / Setter中添加静态方法逻辑

时间:2013-10-11 05:30:14

标签: java jpa

我有一个持久性实体类(JPA),我在辩论在getter和setter中添加一个静态方法调用来做一些转换逻辑,但由于某种原因它似乎不适合做。 getter / setter自定义逻辑是否有最佳实践?这种方法有任何缺点吗? UI需要用“/”输入数据,但是另一个与此接口连接的系统需要将“/”转换为“_”。

@Entity
public class Sample {
 @Id   
 private id;
 @Column
 private String test;

 public String getTest() {
        return Util.convert(test);
 }
 public void setTest(String test) {
        this.test = Util.convert(test);
 }

}

    import org.apache.commons.lang3.StringUtils;
    public class Util{

    public static String convert(String enteredValue){
        return StringUtils.replace(enteredValue,"/","_"); //just example
    }
    }

4 个答案:

答案 0 :(得分:3)

不,您的POJO不应该转换其数据格式只是为了与系统兼容。一旦POJO需要使用具有不同数据格式要求的不同系统,这种方法就会中断。

POJO应将其状态保存为其用户输入。格式的差异应由请求数据的系统处理。这样,如果格式向下变化,则责任在于请求系统不是POJO。如果POJO直接尝试容纳新格式,则可能会破坏可能也依赖于它的任何其他系统。

如果客户端系统需要特定格式的数据并且不希望处理它;然后应该由客户端用来与您联系的YourSystemFacade API处理。例如

// at the other system
YourSystemFacade.getInstance().getTestSample();

// at your system
class YourSystemFacade {
    // ...
    public String getTestSample() {
        return Utils.convert(sample.getTest());
    }
}

答案 1 :(得分:2)

在getter中进行静态方法调用是可以的。但是,如果您的应用程序的其他部分需要原始格式或其他格式的数据,您可能会遇到问题,让我们说/替换为.

替代方法是使用另一种getter方法,比如getTestWithHyphengetTestWithDot

或者让客户在需要不同格式的数据时调用Util方法。

答案 2 :(得分:1)

由于转换逻辑非常简单,您应该将它放在setter中,因为类中的所有其他方法都可以依赖于实例变量始终处于正确状态的事实。 JPA也可以通过现场访问来访问它。

如果转换会更复杂或耗时,我会将其放在getter中,让其他所有方法只通过getter访问它。但是,您还需要一个字段来跟踪该状态,并且必须将JPA配置为使用属性访问。

PS:如果它们属于同一属性,则重命名setName或getTest

答案 3 :(得分:0)

嗯,没有什么能阻止你这样做。你可以做到。

我相信POJO也是一个简单的java类,除了正确的预定义结构之外没什么特别的。

您可以安全地使用它。

从内置方法中获取一些示例。查看getBytes()方法。

来自Open JDK String class

     public byte[] getBytes() {
     return StringCoding.encode(value, 0, value.length);
    }