JavaRush /Java блогу /Random-KY /Жаңы баштаган программисттердин 8 жалпы катасы

Жаңы баштаган программисттердин 8 жалпы катасы

Группада жарыяланган
Салам! Бүгүн биз башталгыч (жана гана эмес) Java иштеп чыгуучулары кетирген 8 жалпы каталардын тизмесин карап чыгабыз. Сиз Интернетте көптөгөн мындай коллекцияларды таба аласыз: алардын көбү бири-бирине окшош. Бул тизмени түзүүдө биз бир критерийди жетекчorкке алдык: окуу жана иштөө учурунда бул каталарды өзүбүз кетирдикпи :) Алар артыкчылыктуу эмес жана түшүнүү жана эстеп калуу үчүн бирдей мааниге ээ.
  1. колдонуу менен an objectтерди салыштыруу ==.

    Оператор ==an object шилтемелерин салыштырат.

    Шилтемелер эстутумдагы даректерди көрсөтүп турат жана эгер алар башка даректерде болсо, салыштыруу аркылуу ==кайтарылат 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);
       }
    }

    Класстагы an objectтерди салыштыруу үчүн Objectатайын ыкма бар - equals(). Анын демейки ишке ашырылышы, ачык айтканда, мындай:

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

    Класстын өзүндө Objectметоддун логикасы equals()эки шилтемени салыштыруу катары ишке ашырылат. Өз кезегинде an objectтерди туура салыштыруу үчүн, бул ыкманы конкреттүү an objectтер үчүн конкреттүү программада маанилүү болгон критерийлерге ылайык кайра аныктоо керек. Теңдиктин критерийлерин өзүң аныктайсың.

    Сиз унутпоо керек болгон бир гана нерсе - бул туура жокко чыгаруу үчүн талаптардын тизмеси equals(). Аларды Интернеттен оңой таба аласыз, бирок биздин күүлүү студенттерибиз бул темада макала даярдашкан .

  2. Статикалык методдордо статикалык эмес өзгөрмөлөрдү колдонуу (жана тескерисинче).

    Эгер сиз " Статикалык эмес өзгөрмө x статикалык контексттен шилтеме кылуу мүмкүн эмес " деген жазууну көргөн болсоңуз - клубга кош келиңиз :)

    Статикалык методдор статикалык эмес класс өзгөрмөлөрүнүн мүмкүнчүлүгүнө ээ эмес.

    Бул логикалык: акыры, статикалык методду класс an objectисин түзбөстөн чакырса болот жана бардык талаа өзгөрмөлөрү конкреттүү an objectтерге таандык. Бул жаңылыштыкка алып келген карама-каршылык.

    Тескерисинче, бул мүмкүн: статикалык өзгөрмөлөрдү статикалык эмес ыкмаларда колдонууга жол берилет:

    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. Параметрлер методдорго кантип берилээрин түшүнбөстүк: шилтеме же маани боюнча.

    Объекттер жана примитивдер методдорго параметр катары ар кандай жолдор менен өтөт: биринчиси шилтеме боюнча, экинчиси маани боюнча.

    Жаңы баштагандарга бул түшүнүктү түшүнүү кыйынга турат, натыйжада алардын codeу күтүлбөгөн жерден иш алып барат:

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

    Эгерде бул мисалда сиз кайсы сан көбөйүп, кайсынысы көбөйбөй турганын так билбесеңиз (кадимки сан же мышыктын жашы), анда бул темадагы лекциябызды кайра окуп чыгыңыз .

  4. Код жазуу эрежелерин этибарга алуу.

    Жана бул белгилүү бир "техникалык" принциптерди сактоого гана эмес, ошондой эле баналдык ат коюу конвенцияларына да тиешелүү.

    Бул эрежелердин баары " өзгөрмөлөрдү кантип атоо керек ", " методдун аталыштарын кантип жазуу керек " деген себептерден улам ойлоп табылган. Бул чындап эле codeдун окулушуна чоң таасирин тийгизет.

    Ведь 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. Неполное понимание работы операторов (арифметических, логических и других).

    Жаңы баштаган программисттердин 8 жалпы катасы - 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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION