CodeGym /Java Blog /ランダム /新人プログラマーが犯す 8 つのよくある間違い
John Squirrels
レベル 41
San Francisco

新人プログラマーが犯す 8 つのよくある間違い

ランダム グループに公開済み
やあ!今日は、新人 (および他の) Java 開発者が犯しやすい 8 つの間違いを見ていきます。このようなリストは Web 上にたくさん見つかります。それらの多くは互いに似ています。私たちがリストを作成する際、私たちは 1 つの基準に導かれました。それは、勉強中や就職中に自分自身が間違いを犯したかどうかです :) それらは重要度によって並べ替えられていません。それらは、あなたが理解して覚えておくことにとっても同様に重要です。
  1. ==を使用してオブジェクトを比較します。

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

    参照はメモリ内のアドレスを指します。異なるアドレスに格納されている場合、==を使用した比較はfalseを返します。

    
    public class Vehicle {
     
        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); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. 引数がメソッドに渡される方法 (参照または値) を誤解しています。

    オブジェクトとプリミティブは 2 つの異なる方法でメソッドに渡されます。1 つは参照による方法、もう 1 つは参照による方法です。2 番目に値による。

    初心者はこの概念を理解するのが難しいと感じることがよくあります。その結果、コードは予期せぬ動作をします。

    
    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 I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
     
    }
    

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

    コーディング標準に固執する場合、コードが理想から程遠い場合でも、少なくとも経験豊富な同僚は、技術的な観点からコードを改善する方法を教えてくれるでしょう :)

  5. Stringクラスの誤解

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    このコードがfalse と表示される理由がわからない場合は、明らかに知識を強化する必要があります:)

    初心者は、文字列プールとその仕組みについてよく知りません。

    その結果、コード内の文字列を適切に比較する方法を完全には理解していません。このトピックについては、レッスンの 1 つで詳しく説明しました。

  6. 例外を正しく処理しない。

    これでつまずくのは初心者だけではありません。経験豊富な開発者もつまずいてしまいます。理由はたくさんあります。

    まず、普遍的なレシピはありません。プログラムには、あらゆる種類のさまざまなエラーとさまざまなエラー処理シナリオがあります。

    次に、誰もがスタック トレースの構造を理解しているわけではありません。エラー処理のアンチパターンは多数あり、それぞれが独自の意味で「間違っています」。これは、エラー処理が他のものよりもはるかに簡単に間違ってしまうということを意味します。

  7. 演算子 (算術演算、論理演算など) がどのように機能するかを完全に理解していない。

    新人プログラマーが犯しやすい 8 つの間違い - 2

    以下に簡単な例を示します。このコードが何を表示するかすぐにわかりますか?

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

    答えが間違っていたり、単に推測しただけだったりしても、この分野にはまだ知識不足があります :)

    等価演算子 ( == ) は後置増分演算子 ( ++ )よりも優先されるため、コードではfalseが表示されます。したがって、7 == i比較が最初に実行され、その後でのみi++演算が実行されます。

    ちなみに、これについては詳しいレッスンもありました。見逃した方はこちらのリンクをどうぞ。

  8. switchステートメント内のワードブレークを省略します。

    この記事を読んでいる多くの人が間違いなくこの間違いを犯しているはずです。:)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    その結果、実行は可能なすべてのオプションを検討します。

    出力:

    数値は 1 に等しい 数値は 2 に等しい 数値は 3 に等しい

    いずれかのオプションの実行が終了すると、break ステートメントは switch ステートメントの実行中断します。忘れないでください。そうしないと、予期しない結果が生じる可能性があります:)

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION