Итак, я пытаюсь создать класс, представляющий вымышленный номер лицензии для данного человека. Номер лицензии строится из следующих функций:Как вы можете создать уникальный серийный номер для данной строки?
- инициалов имени и фамилий
- года лицензия была выдана лицом
- Случайный произвольный серийный номер
Так, например, Мэгги Смит, чья лицензия была выпущена в 1990 году, может иметь номер лицензии MS-1990-11, а 11 - серийный номер. Тем не менее, Марк Сандерс, возможно, выдал лицензию в том же году, что означает, что начало его лицензии может быть также MS-1990.
Так вот в чем проблема. Мне нужно убедиться, что серийный номер для этого человека не такой же, как у Мэгги. Поэтому мне пришлось бы проверять любые записи, которые имеют одинаковые инициалы и год выпуска, а затем генерировать новый уникальный серийный номер. Вот мой код до сих пор:
public class LicenceNumber {
private final Name driverName;
private final Date issueDate;
private static final Map<String, LicenceNumber> LICENCENOS = new HashMap<String, LicenceNumber>();
public LicenceNumber(Name driverName, Date issueDate){
this.driverName = driverName;
this.issueDate = issueDate;
}
public static LicenceNumber getInstance(Name driverName, Date issueDate){
Calendar tempCal = Calendar.getInstance();
tempCal.setTime(issueDate);
String issueYear = String.valueOf(tempCal.get(Calendar.YEAR));
int serialNo = 1;
String k = driverName.getForename().substring(0, 1) + driverName.getSurname().substring(0, 1) + "-" + issueYear + "-" + serialNo;
if(!LICENCENOS.containsKey(k)){
LICENCENOS.put(k, new LicenceNumber(driverName,issueDate));
}
return LICENCENOS.get(k);
}
public boolean isUnique(){
return true;
}
public Name getDriverName() {
return driverName;
}
public Date getIssueDate() {
return issueDate;
}
}
И фрагмент, как он может быть реализован:
public final class DrivingLicence {
private final Name driverName;
private final Date driverDOB;
private final Date issueDate;
private final LicenceNumber licenceNo;
private final boolean isFull;
public DrivingLicence(Name driverName, Date driverDOB, Date issueDate, boolean isFull){
//TO-DO validate inputs
this.driverName = driverName;
this.driverDOB = driverDOB;
this.issueDate = issueDate;
this.licenceNo = LicenceNumber.getInstance(driverName, issueDate);
//this.licenceNo = new LicenceNumber(driverName, issueDate);//instantiate a licence number using the driverName and dateOfIssue
this.isFull = isFull;
}
}
Я основывался на некоторых конспектах, которые обсуждают, как вы можете использовать заводы по уникальности. Я также не уверен, должен ли я создать LicenceNumber с помощью getInstance или путем создания нового объекта. Кто-нибудь знает, как я могу проверить, если серийный номер для данной строки, например. XX-XXXX уже существует?
ли это поддерживается базой данных на всех?Я имею в виду, что представляет собой «существование» - за какие временные рамки? – KevinO
Нет никакой базы данных. Если я внедрил его правильно, LicenceNumbers хранятся на Карте, поэтому я должен проверить там. –
Я бы предложил AtomicInteger. На мгновение я дам быстрый ответ. – KevinO