OOP - 为类添加属性的最佳方法

fra*_*eta 8 java oop inheritance design-patterns hibernate

我们开发了一个用Java编写并用Hibernate映射的HR应用程序; 其中一个特点是招聘阶段.

Candidate班是仿照这样的:

public class Candidate  {
    private String id;
    private Integer candidateCode;
    private GregorianCalendar birthDate;
    private String italianFiscalCode; //unique code for italian people 
}
Run Code Online (Sandbox Code Playgroud)

由于我们只为市场开发到目前为止,代码非常依赖于特定的立法,所以请查看fiscalCode类属性.

请求是我们概括这个概念以便能够扩展到其他市场,例如唯一标识符可以是不同的,可以由几个字符串组成或根本不存在.

在我脑海中浮现的第一件事:

1 - 只需将字段重命名为countryIdentifier,并根据特定国家/地区的需要添加其他字段.

private String countryIdentifier; //general unique code
private Integer greekAddedCode;   
Run Code Online (Sandbox Code Playgroud)

这意味着在需要的地方重构代码(所有放置旧的italianFiscalCode的地方),重命名DBMS列(并最终添加其他代码)并修改使用该字段的所有查询.

这对我来说看起来很糟糕

2 - 子类Candidate创建ItalianCandidateGreekCandidate移动子类中的特定字段.

问题是Candidate该类已经被子类化,HeavyCandidate它具有优化Hibernate映射的唯一功能,因为我们在重类中移动所有"重"属性(多对一和多组)(这是我们遵循的方法与我们所有的豆类).

在这种情况下,最正确的方法是什么?

Tod*_*ell 1

我将创建一个由和等类实现的接口Identifier(不确定名称)。然后我添加一个字段:GreekIdentifierItalianIdentifierCandidate

Identifier identifier;
Run Code Online (Sandbox Code Playgroud)

的实现GreekIdentifier看起来像这样:

public class GreekIdentifier implements Identifier {
    String countryIdentifier;
    int addedCode;

    //constructor, getters, setters ...
    //actual behaviour, Indentifier @Overrides ...
}
Run Code Online (Sandbox Code Playgroud)

如果countryIdentifier确实是所有标识符都具有的东西,您甚至可以将其移至(抽象)基类。