При выполнении небольших одноклассных программ я должен делать все статично или создавать копию самого себя в main? - PullRequest
5 голосов
/ 16 сентября 2009

Когда я работаю над домашними заданиями для класса, обычно полезно, чтобы программы были небольшими, чтобы сохранить проблему в одном классе (легко передать с помощью нашего сценария).

Для этих одноразовых программ имеет смысл объявить все методы и переменные экземпляра как статические или имеет смысл объявить экземпляр самого класса в методе main?

Так, например:

A.

public class MergeSort
{
   public static Scanner input = new Scanner(System.in);

    public static void main(String[] args)
    {
        int[] randData = getRandomData();
        int[] sortedData = mergeSort(randData);
    }

    public static int[] mergeSort(int[] unsortedData)
    {
        // ...
    }

    public static int[] merge(int[] data, int a, int b, int c)
    {
        // ...
    }
}

против

B.

public class MergeSort  
{  
   public Scanner input = new Scanner(System.in);

    public static void main(String[] args)
    {
        MergeSort ms = new MergeSort();
        int[] randData = ms.getRandomData();
        int[] sortedData = ms.mergeSort(randData);
    }

    public int[] mergeSort(int[] unsortedData)
    {
        // ...
    }

    public int[] merge(int[] data, int a, int b, int c)
    {
        // ...
    }
}

Ответы [ 7 ]

12 голосов
/ 16 сентября 2009

Лично я бы пошел с В, это хорошая привычка.Делать каждый метод статическим по умолчанию - плохая привычка.

Раньше это было решение "это зависит от личного мнения", но с ростом модульного тестирования статические методы часто более вредны, чем нет.Вы не можете указать метод как static в интерфейсе, что затрудняет создание интерфейса для вашего класса, что затрудняет имитацию / заглушку вашего класса для модульного тестирования.

4 голосов
/ 16 сентября 2009

Я бы сделал эти методы статичными, поскольку они никак не зависят от состояния объекта. Ведь методы сортировки в классах Arrays и Collections тоже статические.

1 голос
/ 16 сентября 2009

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

Однако, есть много нюансов, которые делают некоторые из существующих ответов (то есть, не используют статические методы) лучшим прагматическим советом. Например, если позже эти классы можно будет использовать в качестве конкретного экземпляра Strategy интерфейса / абстрактного класса, все маркеры static должны быть удалены. Конечно, это все советы - и A, и B - подходящие ответы.

Если ваш инструктор говорит, что только одно является правильным, то он / она применяет другие требования (например, стандарты кодирования для поддержки последующего рефакторинга), помимо требований «здесь и сейчас». Эти другие требования также являются возможностью обучения, поэтому убедитесь, что инструктор объясняет, почему.

1 голос
/ 16 сентября 2009

Для домашней работы я бы сделал привычкой делать все «по книге». Если вы этого не сделаете, вы можете забрать вредные привычки и внести ошибки в свой код в будущем при работе над более сложными заданиями / проектами. Хорошая практика начинается рано и действительно проявляется, когда вы развиваете свои навыки на любом языке (на мой взгляд, именно это иногда делает разницу между «хорошим» программистом и «хорошим» программистом).

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

0 голосов
/ 16 сентября 2009

Для домашней работы это действительно вопрос вкуса. Для реальных проектов вы должны создать экземпляр класса и обернуть его в try/catch, чтобы вы могли напечатать полную трассировку стека, если что-то пойдет не так во время создания класса.

По умолчанию printStackTrace() Java иногда пропускает вложенные исключения, поэтому в итоге вы получите сообщение «произошла ошибка, посмотрите следующее исключение», но вы не сможете ее увидеть.

0 голосов
/ 16 сентября 2009

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

0 голосов
/ 16 сентября 2009

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

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