JavaRush /Java Blog /Random-JA /初心者プログラマーにありがちな 8 つの間違い

初心者プログラマーにありがちな 8 つの間違い

Random-JA グループに公開済み
こんにちは!今日は、初心者 (だけではありません) Java 開発者が犯しやすい 8 つの間違いのリストを見ていきます。インターネット上にはそのようなコレクションが多数見つかります。それらの多くは互いに似ています。このリストを作成したとき、私たちは 1 つの基準に従って行動しました。それは、私たち自身が勉強中や仕事中にこれらの間違いを犯したかどうかです:) それらは優先順位ではなく、理解して記憶する上で同様に重要です。
  1. を使用してオブジェクトを比較します==

    演算子は==オブジェクト参照を比較します。

    参照はメモリ内のアドレスを指しており、それらが異なるアドレスにある場合、比較により が==返されます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);
       }
    }

    クラス内のオブジェクトを比較するには、Object特別なメソッドがありますequals()。率直に言って、デフォルトの実装はまあまあです。

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

    クラス自体では、Objectメソッドのロジックがequals()2 つの参照の比較として実装されます。次に、オブジェクトを正しく比較するには、特定のオブジェクトに対する特定のプログラムで重要な基準に従ってこのメソッドを再定義する必要があります。平等の基準は自分で決めます。

    忘れてはいけない唯一のことは、適切なオーバーライドの要件のリストですequals()。それらはインターネットで簡単に見つけることができますが、私たちの優秀な学生たちがすでにこのトピックに関する記事を作成しています。

  2. 静的メソッドでの非静的変数の使用 (またはその逆)。

    「非静的変数 x は静的コンテキストから参照できません」という碑文を見たことがある方は、クラブへようこそ :)

    静的メソッドは非静的クラス変数にアクセスできません。

    これは論理的です。結局のところ、静的メソッドはクラス オブジェクトを作成せずに呼び出すことができ、すべてのフィールド変数は特定のオブジェクトに属します。これがエラーを引き起こす矛盾です。

    ちなみに、逆に、非静的メソッドで静的変数を使用することは可能です。

    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. パラメーターがメソッドに渡される方法 (参照または値) についての誤解。

    オブジェクトとプリミティブは、さまざまな方法でパラメータとしてメソッドに渡されます。前者は参照によって、後者は値によって渡されます。

    多くの場合、初心者はこの概念を理解するのが難しく、コードが予期しない動作をすることになります。

    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. コードを書くときのルールを無視する。

    そして、これは特定の「技術的」原則の遵守だけでなく、ありきたりな命名規則にも当てはまります。

    「変数の名前の付け方」「メソッド名の書き方」などのルールはすべて、理由があって作られたものです。これはコードの読みやすさに大きく影響します。

    結局のところ、コードは常に自分だけのものであるとは限りません。社内の別のプロジェクトに異動することができ、そのプロジェクトは同僚に引き継がれることになりますが、次のようなものを受け取ったら同僚は明らかに不満を抱くでしょう。

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

    あなたのコードはパフォーマンスの点では優れているかもしれませんが、それが実際にどのように動作するかを読んで理解することが不可能であれば、残念なことに、その価値はわずかです。

    記述基準を遵守すれば、たとえそれが理想から程遠いものであっても、少なくともより経験豊富な仲間によってコードが読まれ、技術的な観点から何が改善できるかを教えてくれるでしょう :)

  5. 授業内容の誤解String

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

    このコードがなぜ を出力するのかわからない場合はfalse、明らかに知識を向上させる必要があります:)

    初心者はそれが何なのか、どのように機能するのかわからないことがよくありますString Pool

    その結果、コード内の文字列を正しく比較する方法は完全には明確ではありません。私たちの講義の 1 つで、このトピックについて詳しく説明しました。

  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