Классы Java — лучшая практика работы с конструкторами (Android)

#java #android #sqlite

#java #Android #sqlite

Вопрос:

Я создал класс и хотел бы включить конструктор, который будет создавать класс из курсора, который будет указывать на базу данных SQLite.

У меня также есть вспомогательный класс базы данных, который находится в том же пакете и имеет статические переменные, которые присваивают метки столбцам в курсоре.

Должен ли я использовать эти ссылки в конструкторе класса или это плохая практика?

Спасибо, m

вот простой общий пример, запрошенный в комментариях…

   public class carDbHelper  extends SQLiteOpenHelper{
      public static final int ROW_ID = 0;
      public static final int ROW_TYPE = 1;

      ...// all db helper code omitted

  }


 public class Car{
            private int id; 
            private String type; 

            public Car (Cursor c){
               this.id = c.getInt(carDbHelper.ROW_ID);
               this.id = c.getString(carDbHelper.TYPE_ID);
            }

        //Other code omitted
     }
  

Комментарии:

1. Определенно неплохая практика, но лично я всегда стараюсь избегать.

2. Причина, по которой я хочу это сделать, заключается в том, что я хотел бы очистить данные, поступающие от курсора. Особенно в случае getInt() . Это возвращает 0, если поле равно нулю, где, как я бы хотел, оно возвращает -1. Другой вариант, который у меня есть, — переопределить методы курсора, чтобы выполнить некоторую проверку перед его возвратом. Вы бы порекомендовали этот подход?

3. Да, я бы тоже их переопределил. Это самый чистый вариант IMO. посмотрите, что говорят другие, но да, для таких вещей я обычно тоже переопределяю и возвращаю то, что мне больше подходит. Он чистый и дает вам больше контроля.

4. Нет ничего плохого в том, чтобы ссылаться на статические переменные некоторого класса из конструктора того же или другого класса. Пожалуйста, опубликуйте некоторый код, который поможет прояснить ситуацию.

5. Извините, я не могу опубликовать код из-за конфиденциальности. Я думаю, что переопределю методы класса cursor. Немного больно, так как их нужно переопределить!

Ответ №1:

Копирование объекта или ссылка на объект — это хорошо, проблема в том, что вам нужно хорошо контролировать время жизни объекта.

Лично я предпочитаю копировать объект, а не ссылаться на него, поскольку действительно трудно понять, когда объект начинает существовать или уничтожается, если на один и тот же объект имеется много непрерывных ссылок.

Комментарии:

1. В этом случае лучше использовать ссылки, потому что вспомогательный класс, вероятно, имеет имена столбцов final static Strings .