Создать экземпляр метода main vs stati c - PullRequest
0 голосов
/ 04 февраля 2020

Мне было интересно, есть ли какая-то польза от этого

public static main(String[] args)
{
    Main mainInstance = new Main();
    mainInstance.Foo();
}

public void Foo() {}

по сравнению с этим

public static main(String[] args)
{
    Foo();
}

public static void Foo() {}

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

В тривиальном примере (например, в вашем примере) нет никакой разницы.

В более общем смысле я могу представить два преимущества первого подхода перед вторым:

  1. Предположим, что методы foo и другие используют информацию, хранящуюся в полях окружающего класса. Если методы static, то поля также должны быть static. Хорошо известно, что переменные stati c затрудняют юнит-тестирование. Первый подход позволяет избежать этой проблемы как для тестирования main, так и для других методов.

  2. Предположим, что функциональность, предоставляемая включающим классом (Main), является нетривиальной, и Вы хотите иметь возможность использовать его повторно. Если вы структурируете свой код следующим образом:

    public class Main {
    
        public static main(String[] args) {
            Main main = new Main();
            // parse 'args' and set config parameters in 'Main' fields 
            main.doIt();
        }
    
        public void doIt() {
            ...
        }
    }
    

    , то вы можете использовать функциональность main другими способами. Например, вы можете использовать его следующим образом:

    Main.main(new String[]{"arg1", "arg2"});
    

    или примерно так:

    Main m = new Main();
    m.setConfigParam1(...);
    m.setConfigParam2(...);
    m.doIt();
    

    Использование полей экземпляра и экземпляра обеспечивает большую гибкость.

Важны они или нет, зависит от контекста.

0 голосов
/ 04 февраля 2020

Stati c методы / переменные хранятся в памяти c. Они всегда присутствуют в памяти, даже если эти методы / переменные не используются один раз. Поэтому, если есть некоторый код, который использует большую память, не рекомендуется объявлять их как stati c. С другой стороны, если некоторые методы редко вызываются в течение всего процесса выполнения и не зависят от состояния объекта, его можно объявить как stati c. Это сэкономит память для объявления объекта, его переменных класса и т. Д. c ..

...