38437


今このようなコードを書いたのですが、Carクラスそれ自体が「Carクラスのリスト」を持つのは変だと知人に言われたのですが、コマンド入力のコードはmain関数のみに書くのと同様、普通はそのようには書かないのでしょうか？

[code]

    public class Car{
         ArrayList<Car> list;
         String plate, brand;
         int year;
    
    
        Car(){
        list = new ArrayList<Car>();
        plate = null;
        brand = null;
        year = 0;
       }
    
    public void add(String[] sp) {
        int year = Integer.parseInt(sp[3]);
        list.add(new Car(sp[1], sp[2], year));
    }
    
    }
    
    public class Main {
    public static void main(String[] args) throws IOException {
    
        Car c = new Car();
    
        while(true) {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s = br.readLine();
    
            String[] sp = s.split(" ");
    
    
            if(sp[0].equals("add")) {
                c.add(sp);
            }
    }
    
[/code]


CC BY-SA 3.0
2017-10-04T14:10:11.587
38433
2017-10-07T14:37:13.967
22984
question
java arraylist
JavaのArrayListに関しての、コーディングマナー(?)についての質問です。


マナーではなく、実現性の問題で実現できないと考えたほうがよいです。

質問の`Car`クラスを例にすると、`Car`クラスのメンバに`List<Car>`を持つと自身(`list`)が初期化できない(少なくとも`List<Car>`は初期化できない)です。

仮に`list`が初期化された`Car`インスタンスと、`list`が`null`の`Car`インスタンスが混在する場合、インスタンス生成後の処理で`list`が有効かどうかを判断して処理を振り分ける必要があり、それを`Car`自身で行うメリットはないと思います。  
そういう意味で「実現できないと考えたほうがよい」と思います。


CC BY-SA 3.0
2017-10-04T21:44:25.197
38436
2017-10-04T21:44:25.197
20098
38433
answer


一般的には、自クラスのリストをフィールドとして持つのは、ツリー構造やグラフ構造を表現する場合によく行われる設計です。

例示されているコードの場合、

  * 「`main()` の最初で作られる `c` インスタンス」と「`c.add()` で追加される`Car`インスタンス」の役割が異なるように見える
  * `Car` という名前から、ツリー構造やグラフ構造が必要だとは考えにくい

以上から、極めて不自然な設計という印象です。  
`c` インスタンスの役割には `CarList` という専用のクラスを用意するか、`ArrayList<Car>` をそのまま使えば良いかもしれません。


CC BY-SA 3.0
2017-10-04T21:59:54.500
38437
2017-10-04T21:59:54.500
3475
38433
answer


int32_tさんの回答で十分かとおもいますが、別の表現で言えば…

例示のCarクラスが、ナンバーや車種といったシステム上で必要な情報を持つだろうことはクラスの名前を見たときに想像できます。

が、CarがCarのリストを持っていること、そしてそのリストの用途を想像することはできませんし、想像できたとしても人によって異なる用途を想像します。

そういった点から、わかりにくいコードであるため、普通はこう書かないと思います。


CC BY-SA 3.0
2017-10-07T14:37:13.967
38513
2017-10-07T14:37:13.967
12233
38433
answer