这是一个面试问题,我一片空白,没有任何想法。
假设我的Employee类有三个字段EmpId
,EmpName
,EmpAddress
。
现在我的工作是确保我创建的所有对象在EmpId
的基础上都是唯一的,这样当我尝试创建两个具有相同EmpId
的对象时,必须有一个机制停止/提醒我,可能是编译器警报或任何逻辑。
我在访谈中唯一能提出的问题是使用Map
(即HashMap),密钥为EmpId
以确保唯一性。
我知道DB中的主键可以确保这一点,但我如何在Java中处理它。
对此类线路的任何建议/想法都将不胜感激。
答案 0 :(得分:1)
我可以想到很多方法。例如 1 :
1 - 还有其他各种"穷人"我不会列举的解决方案。
2 - 这并没有真正解决所述的问题。但是,这可能是你在实践中如何实现这一点的;例如使用SQL SEQUENCE。
答案 1 :(得分:0)
我认为您可以使用 HashSet 或类设置的另一种实现来解决您的问题,并且覆盖方法等于< / em>避免重复输入课程。
来自类Set 的Java documentation的
集合框架接口中的许多方法都是用术语定义的 等于方法。
N.B。 HashSet和Set实现接口集合
我将向您展示一个使用 contains
方法避免重复的示例来自方法的Java documentation的包含类
boolean contains(Object o)
如果此集合包含,则返回true 指定的元素。更正式地说,当且仅当这样时,返回true 集合包含至少一个元素e,使得(o == null? e == null:o.equals(e))。
在此代码中,我使用静态HashSet来获得 Employee 的唯一列表。只有在成功将元素插入HashSet时,才能使用返回 true 的 addToSet 方法在集合中插入元素。
import java.util.HashSet;
public class Employee {
private static HashSet<Employee> EmpSet= new HashSet<>();
private String EmpId, EmpName, EmpAddress;
public Employee(String id, String name, String addr){
EmpId = id;
EmpName = name;
EmpAddress = addr;
}
public static boolean addToSet(Employee employee){ //this can be synchronized if you need
if(EmpSet.contains(employee))
return false;
else
EmpSet.add(employee);
return true;
}
@Override
public boolean equals(Object to_compare){
if( !(to_compare instanceof Employee))
return false;
Employee other = (Employee) to_compare;
return this.EmpId.equals(other.EmpId);
}
}
如果EmpId为Integer或Long,则显示的代码也有效。 如果您从多个线程使用此类,则可以按照注释中的建议使方法 addToSet 同步。
如果您使用的数据库此代码无效,您可以找到针对该特定情况的特定方法。
修改强> 对不起,实际上你不需要方法addToSet,因为类 HashMap 的方法 add 完全相同,所以你可以使用它的方法或简单:
public static boolean addToSet(Employee employee){ //this can be synchronized if you need
EmpSet.add(employee);
}
答案 2 :(得分:0)
正如其他人所说,您可以使用Map
或Set
来保存您的收藏集,并覆盖equals
和hashCode
方法以确保正确使用集合。
如果您想检查对象的创建,您可以例如使用Map
并抛出异常:
import java.util.Set;
import java.util.HashSet;
public class Employee {
private static Map<EmpID, Employee> employees = new HashMap<EmpID, Employee>();
private EmpId empID;
private EmpName empName;
private EmpAddress address;
public Employee(EmpID empID, EmpName empName, EmpAddress empAddress) throws NotUniqueIDException {
if(!employees.keySet().contains(empID) {
this.empID = empID;
this.empName = empName;
this.empAddress = empAddress;
employees.put(empID, this);
} else {
// Error
throw NotUniqueIDException();
}
}
然后,在使用时:
try {
Employee employee = new Employee(empID, empName, empAddress);
} catch(NotUniqueIDException exception) {
// Do something here
}
至于您是否需要生成唯一ID,UUID.randomUUID()
可能需要查看