1

我有一个持久性实体类 (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

4 回答 4

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());
    }
}
于 2013-10-11T05:52:15.283 回答
2

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

另一种方法是使用另一种 getter 方法,例如getTestWithHyphenor getTestWithDot

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

于 2013-10-11T05:43:52.130 回答
1

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

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

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

于 2013-10-11T05:46:24.043 回答
0

好吧,没有什么能阻止你这样做。你能行的。

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

您可以安全地使用它。

也从内置方法中举一些例子。看看getBytes()方法。

来自Open JDK String 类

     public byte[] getBytes() {
     return StringCoding.encode(value, 0, value.length);
    }
于 2013-10-11T05:42:15.660 回答