Я изучаю, как использовать отражение для инициализации пользовательского объекта. Например, у моего объекта есть несколько полей разных типов, однако ни одно из полей не имеет типа String. Я использовал chararrays вместо строк, потому что я хочу очистить объекты и не беспокоиться о неизменных строках, находящихся в куче, если приложение cra sh.
Кроме того, потому что класс реализует CharSequence, stati c поля buff, offset и count обязательны для заполнения. Также стоит упомянуть, что геттеры и сеттеры синхронизированы, поскольку этот объект будет использоваться в многопоточной среде. Наконец, существует собственный список объектов Person с именем People, который находится в своем собственном файле People. java и представляет собой настраиваемую коллекцию объектов Person. Дополнительные сведения об объекте приведены для краткости.
Вопрос в том, как проверить наличие пустых, пустых или пустых полей в моем объекте Person? В моем основном классе я хочу проверить наличие пустых или пустых значений перед тем, как вставить указанный объект в базу данных бэкэнда. Я попытался создать и Person.isNull()
, и аналогичную функцию Person.hasNull()
для проверки пустых значений в полях char[]
, но результаты АБСОЛЮТНО НЕ те, которые я ожидал. Команда println statemnt внутри теста для isCharArray обнаружила некоторые вещи, которые я в настоящее время не понимаю .....
Вот пример выходных данных:
Size of byte: 1 bytes.
Size of short: 2 bytes.
Size of int: 4 bytes.
Size of long: 8 bytes.
Size of char: 2 bytes.
Size of float: 4 bytes.
Size of double: 8 bytes.
buff: char[] 11
personID: char[] 11
personTitle: char[] 11
personFirstName: char[] 11
personLastName: char[] 11
, который был создан с использованием следующей системы. Утверждение out.println:
System.out.println(f.getName() + ": " + f.getType().getCanonicalName() + " " + String.valueOf(value).length());
и поднимает 2 вопроса:
- Почему 11? !!!!!
- Как правильно проверить на пустоту, пустые поля или поля нулевой длины? !!!
Пожалуйста, помогите ....
public class Person implements Serializable,
Comparable<Person>,
CharSequence,
Cloneable { // the object to model
// Fields 0, 1, and 2 are required to implement CharSequence
// http://www.java2s.com/Tutorial/Java/0040__Data-Type/implementsCharSequence.htm
private static char[] buff = {'\0'}; // No static fields are ever // Field 0
private static int offset = 0; // written to file. Their values // Field 1
private static int count = 0; // must be reconstructed. // Field 2
// default serialVersion id
private static final long serialVersionUID = 7891011129876814235L; // Field 3
private final static LocalDateTime rightNow = LocalDateTime.now();
private long localSerialVersionUID= serialVersionUID; //1st field written to file // Field 4
private LocalDateTime personCreatedDateTime= rightNow; // Field 5
private LocalDateTime personLastUpdate = rightNow; // (YYYY-MM-DD) // Field 6
private char[] personID = {'\0'}; // (PK) possibly int auto increment // Field 7
private char[] personTitle = {'\0'}; // Field 8
private char[] personFirstName = {'\0'}; // Field 9
private char[] personLastName = {'\0'}; // Field 10
private LocalDate personDOB = LocalDate.parse("1010-10-10"); // (YYYY-MM-DD) // Field 11
public Person(
final long serialUID, //4
final LocalDateTime createdDateTime, //5
final LocalDateTime lastUpdate, //6
final char[] id, //7
final char[] title, //8
final char[] firstName, //9
final char[] lastName, //10
final LocalDate DOB //11
) {
this.localSerialVersionUID(serialUID); //4
this.personCreatedDateTime(LocalDateTime.now()); //5
this.personLastUpdate(lastUpdate); //6
this.personID(id); //7
this.personTitle(title); //8
this.personFirstName(firstName); //9
this.personLastName(lastName); //10
this.personDOB(DOB); //11
}
public boolean hasNull() {
Field fields[] = this.getClass().getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
try{
Object value = f.get(this);
if ( value == null) {return true; } // default condition
boolean isCharArray = f.getType().getCanonicalName().equals("char[]" );
// No need to check fields that are not char[]
if (( isCharArray) ) {
// ************* this compiles and executes (doesn't crash), but it doesn't produce intended results *********
System.out.println(f.getName() + ": " + f.getType().getCanonicalName() + " " + String.valueOf(value).length());
if ( String.valueOf(value).length() == 0) {return true;}
if ( String.valueOf(value).isEmpty()) {return true;}
if ( String.valueOf(value).isBlank()) {return true;}
if ( String.valueOf(value).equals('\0')) {return true;}
}
// ************* this compiles and executes (doesn't crash), but it doesn't produce intended results *********
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
}
//enter code here
/**
* @param args
*/
public static void main(String[] args) {
People<Person> people = new People()<>; //customized list of person objects
People<Person> people2 = new People()<>; //customized list of person objects
Person thomas = new Person().personFirstName("Thomas".toCharArray());
// all other char array fields = {'\0'}
people.add(thomas);
Person sybil = new Person().personFirstName("Sybil".toCharArray());
// all other char array fields = {'\0'}
people2.add(sybil);
if (!thomas.hasNull() ){ // ******* currently this test fails and a Person gets inserted to the People list
People.insertPerson(thomas);
}
if (!sybil.hasNull() ){ // ******* currently this test fails and a Person gets inserted to the People list
People.insertPerson(sybil);
}
}
}