Почему я должен помещать main() в выделенный класс?

У меня нет опыта Java и есть фон C.

Я хотел бы создать новый тип данных, например абстрактный тип данных. В C это будет сделано путем создания структуры для нового типа данных; Я понимаю, что в Java вы создаете класс для этого нового типа данных, а затем начинаете создавать объекты для этого класса.

Я написал два разных способа, и они оба работают. Но я не понимаю недостатков второго пути.

  • Здесь я создаю класс для типа данных, создаю его экземпляр и выполняю операции. Я нашел, что это дизайн, используемый в учебных пособиях в Интернете.

    public class DesignOne {
        public static void main(String[] args) {
            MyDataType obj = new MyDataType(3,4);
            System.out.println(obj.sum());
        }
    }
    
    class MyDataType {
        int i;
        int j;
    
        MyDataType(int i, int j) {
            this.i = i;
            this.j = j;
        }
    
        int sum() {
            return this.i + this.j;
        }
    }
    
  • Здесь я создаю экземпляр класса в том же классе, где у меня есть моя функция драйвера. Операции типа sum также определяются как члены класса. В принципе, есть только один класс.

    public class DesignTwo {
        int i;
        int j;
    
        DesignTwo(int i, int j) {
            this.i = i;
            this.j = j;
        }
    
        int sum() {
            return this.i + this.j;
        }
    
        public static void main(String[] args) {
            DesignTwo obj = new DesignTwo(3,4);
            System.out.println("sum == "+obj.sum());
        }
    }
    

Каковы недостатки DesignTwo, и почему предпочтительнее DesignOne?

Ответ 1

Он по существу сводится к Abstraction. Вы должны попытаться дать каждому классу одну роль. Здесь у вас есть две роли, которые необходимо заполнить:

  • Загрузите объект и покажите его
  • Представить объект

Поэтому вы должны использовать два класса. Преимущество становится более очевидным после того, как вы начнете хотеть использовать и отображать более одного типа вещей в своей программе.

Ответ 2

Там нет неотъемлемой разницы между этими двумя (хотя в общем случае нечистые публичные поля обычно обескуражены). Единственное различие заключается в том, где вы помещаете основной метод, который концептуально не относится к какому-либо определенному классу. В более крупных программах он обычно живет в отдельном классе запуска только потому, что не имеет смысла привязывать его к какому-либо произвольному классу, но это в основном не имеет отношения к моделированию данных.