JavaのArrayListに関しての、コーディングマナー(?)についての質問です。


今このようなコードを書いたのですが、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]




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

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

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

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




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

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

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

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

