Как правильно проверить поля char [] в моем пользовательском объекте на пустые, пустые или пустые значения? и почему char [] указывает длину 11? - PullRequest
0 голосов
/ 14 февраля 2020

Я изучаю, как использовать отражение для инициализации пользовательского объекта. Например, у моего объекта есть несколько полей разных типов, однако ни одно из полей не имеет типа 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 вопроса:

  1. Почему 11? !!!!!
  2. Как правильно проверить на пустоту, пустые поля или поля нулевой длины? !!!

Пожалуйста, помогите ....

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);
        }
    }
}

1 Ответ

0 голосов
/ 19 февраля 2020

String.valueOf (). Length () возвращает 11, потому что это количество цифр / символов в выводе (т. Е. [@ 936016386 - адрес - содержит 11 символов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...