7 корисних порад для новачків в Java

24 серпня 2015 14:22 k.illenko 2057 5

Доброго дня, шановні читачі Codeguida! В цій невеликій статті, я хотів би дати декілька порад, що, на мою думку, можуть бути корисними для тих, хто відносно недавно розпочав вивчення Java.

1) Уникайте створення зайвих об’єктів і завжди віддавайте перевагу «лінивій» ініціалізації.

Як відомо, сворення об’єктів в Java – дорога, в плані продуктивності та використання пам’яті, операція. Таким чином, бажано, створювати або ініціалізувати об’єкти лише тоді, коли це необхідно.

public class Human {
    private List friends;
    public List getFriends () {
        //ініціалізація лише тоді, коли це необхідно
        if(null == friends) {
            friends = new ArrayList();
        }
        return friends;
    }
}

2) Щоб перевірити порожній рядок завжди використовуйте isEmpty() замість equals().

Є декілька різних шляхів, щоб перевірити порожній рядок чи ні, і один з них це abc.equals(“”). Ніколи не робіть так.
Найкращий спосіб перевірити порожній рядок рядок чи ні – використання методу isEmpty().Цей метод просто порівнює довжину рядку з 0, використовуючи метод length(). Тому ця операція є менш витратною.

Щоб впевнитись, просто порівняте вихідний код equals() та isEmpty():

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
public boolean isEmpty() {
        return value.length == 0;
}

3) Повертайте порожні колекції замість null.

Якщо функція повертаю колекцію, що немає значень, переконайтеся, що повертається саме пуста колекція, а не null. Це позбавить вас додаткових перевірок на null.

public List<User> getUsers() {
    return ( null == users ? new ArrayList<User>(0) : users);
}

4) Використовуйте рядки обережно.

Якщо два рядки об'єднані за допомогою "+" в "for" циклі, то кожного разу створюється новий об'єкт String. Це викликає втрати пам'яті і збільшує час виконання. Крім того, уникайте використання конструктору при створення рядка.
Наприклад

//Повільніша ініціалізація
String str1 = new String("Повільніша ініціалізація");
//Швидша ініціалізація
String str2 = "Швидша ініціалізація";

5) Намагайтесь використовувати примітиви замість класів-обгорток.

Класи-обгорки працюють повільніше за примітиви, оскільки вони зберігають додаткову інформацію, а примітиви – це лише значення.
Іноді програміст може зробити помилку в коді, використовуючи клас-обгортку. Розглянемо наведений нижче приклад:

int x = 10;
int y = 10;
Integer x1 = new Integer(10);
Integer y1 = new Integer(10);
System.out.println(x == y);
System.out.println(x1 == y1);

Перший sysout, друкуватиме true, в той час як другий буде друкувати false. Проблема в тому, що для порівняння двох об'єктів класу-обгортки ми не можемо використовувати оператор ==, оскільки він порівнює посилання, а не фактичне значення.

6) Ніколи не кидайте “java.lang.Exception”.

Ніколи не кидайте відразу java.lang.Exception. Це суперечить меті використання зазначених винятків. Кидайте більш конкретні виключення, або створюйте власні, якщо не знайшли необхідного, для конкретної ситуації.

7) Обробка NullPointerException.

NullPointerException, є досить поширеним винятком в Java. Цей виняток виникає, коли ми намагаємось звернутись до метода чи поля об’єкта, що є посиланням на null.

Ніколи не обробляйте NullPointerException за допомогою try-catch-finally. Більше доцільним буде перевірка поля на null.

int noOfStudents = 0;
if(school.listStudents() != null) {
     noOfStudents = school.listStudents().count;
}

Шановні читачі, якщо стаття вам здалася цікавою й ви хотіли б побачити на Codeguida щось інше стосовно Java, будь ласка, пишіть теми для статей в коментарях.

Дякую за увагу!

Іллєнко Костянтин, Java Software Engineer.

Використані матеріали:

1) 10 Most Useful Java Best Practice Quotes for Java Developers

2) 30 Java Programming Tips and Best Practices for Beginners

2057 12

Схожі матеріали:

Коментарі:

Костя Третяк

25 Сер 2015 01:44

Тут точно правильно поставлено кому?

Є декілька різних шляхів, щоб перевірити порожній рядок, чи ні і один з них це

Ne1c

20 Вер 2015 17:34

Зауважання щодо:
if(null == friends) {
friends = new ArrayList();
}

Умову перевірки краще зробити такою friends == null, так як ми об'єкт friends перевіряємо на null, а не навпаки.

Taras Leskiv

06 Жов 2015 01:02

Напевно звичка з плюсів де можна випадково присвоїти значення замість перевірки, в Java дійсно так робити не треба, ламає органіку порядку читання коду)

Egor

20 Вер 2015 22:15

Як відомо, сворення об’єктів в Java – дорога, в плані продуктивності та використання пам’яті, операція.

Це неправда, в сучасних jvm ця операція дуже дешева. Взагалі ваші ствердження про швидкодію вже не сильно актуальні, хоча я згоден з вашими рекомендаціями, причини аж ніяк не в швидкості операцій.

1) Лінива ініціалізація корисна коли процес ініціалізації пов'язаний з якою-небудь важкою операцією, наприклад запит у БД. В інших випадках це не обов'язково.

2) abc.isEmpty() просто краще відображає суть ваших намірів ніж abc.equals(""). Готовий битись об заклад, що це ніколи не буде причиною поганої швидкодії вашого продукту.

3) тут повністю згоден але код який ви запропонували може викликати дуже непередбачувані помилки. Якщо я захочу використати ваш клас a.getUsers().add(myUser) то це нічого не дасть, такі помилки дуже важко відслідковувати. Тут є два варіанти:

або ми дозволяємо редагування колекції юзерів:

public List<User> getUsers() {
    if (users == null) {
      users = new ArrayList<>();
    }
    return users;
 }

або список юзерів доступний тільки на читання:

public List<User> getUsers() {
  return users == null ? Collections.emptyList() : users;
 }

4) ви сказали про проблему конкатенації рядків у циклі але не вказали рішення цієї проблеми. Для тих кому знадобиться треба дивитися java.lang.StringBuilder.

Elias Ovchynnikov

30 Кві 2016 00:57

Підтримую позицію Єгора. Хочу додати кілька додаткових уваг:
4) Можете цим вже не перейматися. Нові компілятори підставлять java.lang.StringBuilder за вас. Поза тим, проблема у коді з new String("") / "" не у тому, що створення об'єкту є важкою операцію (нотація "" теж може створювати об'єкт), а у тому, що 1 варіант створює рядок у heap замість string pool, що може вплинути на швидкодію, коли зустрічаються багато однакових рядків.
5) Дуже поверхнево. "Перший sysout, друкуватиме true, в той час як другий буде друкувати false." - і тут у читача-початківця питання: А чому тоді перший тру?? Варто доповнити у контексті auto-unboxing.

Авторизуйтесь, щоб залишити коментар.