Вроде бы "Каждый case оператора switch" имеет "блок синхронизации по allPeople."
Есть ли у кого какие-нибудь идеи?
Заранее благодарен
package com.javarush.task.task17.task1711;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/*
CRUD
*/
public class Solution {
public static volatile List<Person> allPeople = new ArrayList<Person>();
public static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
static {
allPeople.add(Person.createMale("Иванов Иван", new Date())); //сегодня родился id=0
allPeople.add(Person.createMale("Петров Петр", new Date())); //сегодня родился id=1
}
public static void main(String[] args) throws ParseException {
List<String> listArgs = new ArrayList<>(Arrays.asList(args));
listArgs.remove(0);
switch (args[0]) {
case "-c":
synchronized (allPeople) {
for (int i = 0; i < listArgs.size() / 3; i++) {
List<String> argsPortion = listArgs.subList(3 * i, 3 * i + 3);
System.out.println(createPerson(argsPortion));
}
}
break;
case "-u":
synchronized (allPeople) {
for (int i = 0; i < listArgs.size() / 4; i++) {
List<String> argsPortion = listArgs.subList(4 * i, 4 * i + 4);
updatePerson(argsPortion);
}
}
break;
case "-d":
synchronized (allPeople) {
for (int i = 0; i < listArgs.size(); i++) {
int id = Integer.valueOf(listArgs.get(i));
setPersonDataToNull(id);
}
}
break;
case "-i":
synchronized (allPeople) {
for (int i = 0; i < listArgs.size(); i++) {
int id = Integer.valueOf(listArgs.get(i));
System.out.println(getPersonInfo(id));
}
}
break;
default:
throw new IllegalArgumentException("Unknown argument \"" + args[0] + "\"");
}
}
public static int createPerson(List<String> args) throws ParseException {
Person person;
String name = args.get(0);
Date birthDate = sdf.parse(args.get(2));
String gender = args.get(1);
if ("ж".equals(gender))
person = Person.createFemale(name, birthDate);
else
person = Person.createMale(name, birthDate);
allPeople.add(person);
return allPeople.indexOf(person);
}
public static void updatePerson(List<String> args) throws ParseException {
int id = Integer.valueOf(args.get(0));
String name = args.get(1);
Sex sex = "ж".equals(args.get(2))? Sex.FEMALE : Sex.MALE;
Date birthDate = sdf.parse(args.get(3));
allPeople.get(id).setName(name);
allPeople.get(id).setSex(sex);
allPeople.get(id).setBirthDate(birthDate);
}
public static void setPersonDataToNull(int id) {
allPeople.get(id).setSex(null);
allPeople.get(id).setName(null);
allPeople.get(id).setBirthDate(null);
}
public static String getPersonInfo(int id) {
Person personInfo = allPeople.get(id);
sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);
return personInfo.getName()
+ (personInfo.getSex() == Sex.FEMALE? " ж " : " м ")
+ sdf.format(personInfo.getBirthDate());
}
}
switch
есть блокdefault
, который выбрасывает исключение если параметрargs[0]
не подошёл ни под одно из условийcase
. Валидатор, в силу того, что далеко не идеальный, может не пропустить код, притом совсем не обязательно, что он адекватно укажет на проблему.