Повторное использование класса после вызова статических методов - PullRequest
0 голосов
/ 01 августа 2011

Предположим, у меня есть класс с несколькими статическими методами void, например:

class MyClass {
    public static void doJob() {
        // ...
    }
    public static void doSmthElse() {
         // ...
    }
}

как я могу изменить его так, чтобы он вызывал мои статические методы следующим образом:

MyClass.doJob().doSmthElse().doJob();

вместо

MyClass.doJob();
MyClass.doSmthElse();
MyClass.doJob();

Я знаю, как это сделать с нестатическими методами (просто вернуть это), но как это сделать со статическими полями?

Ответы [ 4 ]

8 голосов
/ 01 августа 2011

Ну, вы могли бы сделать это:

// Horrible, don't do it!
class MyClass {
    public static MyClass doJob() {
        // ...
        return null;
    }
    public static MyClass doSmthElse() {
        // ...
        return null;
    }
}

В этот момент ваш код скомпилируется, поскольку Java разрешает доступ к статическим методам «через» ссылки. Тот факт, что вы возвращаете null, не имеет значения, потому что компилятор будет смотреть только на тип времени компиляции выражения MyClass.doJob(), чтобы определить, какой метод doSmthElse() вызывать; статический метод будет вызван без проверки возвращаемого значения.

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

Параметры:

  • Просто живите со своими более подробными звонками
  • Извлечение статических методов в класс, где для них имеет смысл быть методами экземпляра (это также может улучшить тестируемость и т. Д.)
  • Статический импорт методов
  • Создайте больший метод в MyClass, который вызывает три метода один за другим.
1 голос
/ 01 августа 2011

Вы можете сделать этот класс одиночным и сделать

return getInstance();

в каждом методе

1 голос
/ 01 августа 2011

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

class MyClass {

    private static int data = 0;
    private static MyClass link = null;

    public static void doJob() {
        // do job with static data such as "data"
        return checkMe();
    }

    public static void doSmthElse() {
        // do someting else with static data such as "data"
        return checkMe();
    }

    private MyClass static void checkMe() {
        if (link == null) link = new MyClass();
        return link;
    }

}
0 голосов
/ 01 августа 2011

Это невозможно, потому что нет объекта, который вы можете вернуть.

...