JavaRush /Java Blog /Random-TK /Täzelikçi programmistleriň 8 umumy ýalňyşlygy

Täzelikçi programmistleriň 8 umumy ýalňyşlygy

Toparda çap edildi
Salam! Bu gün Java öwrenijiler tarapyndan (we diňe bir däl) goýlan 8 umumy ýalňyşlygyň sanawyna serederis. Şeýle kolleksiýalary internetde tapyp bilersiňiz: köpüsi biri-birine meňzeýär. Bu sanawy düzenimizde, bize bir kriteriýa ugrukdyryldy: okuw we iş wagtynda bu ýalňyşlyklary özümiz goýdukmy :) Bular ileri tutulmaýar we düşünmek we ýatda saklamak üçin deň derejede möhümdir.
  1. Ulanylýan obýektleri deňeşdirmek ==.

    Operator ==obýekt salgylanmalaryny deňeşdirýär.

    Salgylar ýatdaky salgylary görkezýär we dürli salgylarda bolsa, deňeşdirme ==gaýdyp geler false.

    public class Car {
    
       String model;
       int maxSpeed;
       int yearOfManufacture;
    
       public Car(String model, int maxSpeed, int yearOfManufacture) {
           this.model = model;
           this.maxSpeed = maxSpeed;
           this.yearOfManufacture = yearOfManufacture;
       }
    
       public static void main(String[] args) {
           Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
           Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
           System.out.println(ferrari == ferrariTwin);
       }
    }

    Synpdaky obýektleri deňeşdirmek üçin Objectýörite usul bar - equals(). Dogrusyny aýtsak, onuň ýerine ýetirilişi şeýle:

    public boolean equals(Object obj) {
       return (this == obj);
    }

    Synpyň özünde Objectusulyň logikasy equals()iki salgylanmany deňeşdirmek hökmünde amala aşyrylýar. Öz gezeginde obýektleri dogry deňeşdirmek üçin bu usuly belli bir obýektler üçin belli bir programmada möhüm bolan kriteriýalara laýyklykda täzeden kesgitlemeli. Deňlik ölçeglerini özüňiz kesgitleýärsiňiz.

    Forgetatdan çykarmaly däl zadyňyz, dogry ýazmak üçin talaplaryň sanawy equals(). Olary aňsatlyk bilen internetde tapyp bilersiňiz, ýöne ajaýyp okuwçylarymyz bu mowzukda eýýäm makala taýýarladylar .

  2. Statik däl üýtgeýjileri statiki usullarda ulanmak (we tersine).

    " Statik däl üýtgeýän x statiki kontekstden salgylanyp bolmaz " diýen ýazgyny gören bolsaňyz - kluba hoş geldiňiz :)

    Statik usullaryň statik däl synp üýtgeýjileri ýok.

    Bu mantykly: ahyrsoňy, synp obýektini döretmezden statiki usul çagyrylyp bilner we ähli meýdan üýtgeýjileri belli bir obýektlere degişlidir. Erroralňyşlyga alyp barýan gapma-garşylyk.

    Munuň tersine, mümkin: statiki üýtgeýänleri statik däl usullarda ulanmaga rugsat berilýär:

    public class Main {
    
       public int x = 10;
    
       public static int staticX = 100;
    
       public static void main(String[] args) {
    
           System.out.println(x);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  3. Parametrleriň usullara nädip geçirilýändigine düşünmezlik: salgylanma ýa-da baha boýunça.

    Obýektler we başlangyçlar dürli usullar bilen parametrler hökmünde usullara geçirilýär: birinjisi salgylanma boýunça, ikinjisi baha boýunça.

    Täze başlanlar köplenç bu düşünjä düşünmek kyn düşýärler, netijede kodlary garaşylmadyk hereket edýär:

    public class Main {
    
       public static void main(String[] args) {
    
           int x = 7;
           incrementNumber(x);
           System.out.println(x);
    
           Cat cat = new Cat(7);
           catLevelUp(cat);
           System.out.println(cat.getAge());
    
       }
    
       public static void catLevelUp(Cat cat) {
    
           cat.setAge(cat.getAge()+1);
       }
    
       public static void incrementNumber(int x) {
           x++;
       }
    }

    Bu mysalda haýsy sanyň köpeljekdigini we haýsynyň köpelmejekdigini anyk bilmeýän bolsaňyz (adaty san ýa-da pişigiň ýaşy), bu mowzukdaky leksiýamyzy täzeden okaň .

  4. Kod ýazmagyň düzgünlerini äsgermezlik etmek.

    Bu diňe bir “tehniki” ýörelgeleriň berjaý edilmegine däl-de, eýsem at dakmak baradaky konwensiýalara hem degişlidir.

    “ Üýtgeýjileri nädip atlandyrmaly ”, “ usul atlaryny nädip ýazmaly ” bu düzgünleriň hemmesi bir sebäp bilen oýlanyp tapyldy. Bu, koduň okalmagyna hakykatdanam uly täsir edýär.

    Ведь code не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

    public class Cat {
    
       private int S_O_M_E_T_H_I_N_G = 7;
       public String striiiiiiiiiiiiiing;
       protected double X3_4TO_ET0_TAK0E = 3.14;
       boolean random = Math.random() > 0.5;
    
    }

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

    Придерживайся стандартов написания, и твой code, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот code выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и How он работает.

    Как следствие, не до конца ясно, How правильно сравнивать строки в своем codeе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

    Täze programmistleriň 8 umumy ýalňyşlygy - 2

    Простой пример. Сможешь сходу сказать, что выведет этот code?

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 6;
           System.out.println(7 == i++);
       }
    }

    Если ты ответил неправильно or наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот link, если пропустил.

  8. Пропуск слова break в операторе switch.

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION