(Используя терминологию Java): статические методы могут быть связаны со статическими членами (членами объекта class
). Если методы не имеют доступа к статическим членам (ни к ресурсам ввода-вывода, ни к чему-либо еще, что может изменить состояние), или если эти члены являются final
примитивами или неизменяемыми объектами (по сути, константами), то такие статические методы можно было бы назвать функциями, но в целом, поскольку они потенциально могут получить доступ к членам объекта class
, их обычно называют статическими методами.
Чтобы считаться функцией, метод должен быть независим ни от какого состояния; он не должен вызывать никаких побочных эффектов и не должен подвергаться каким-либо побочным эффектам. При вызове с определенными параметрами он всегда должен возвращать один и тот же результат. В противном случае это не чистая функция.
То есть следующий area
является функцией:
class MyClass {
static final double pi = 3.14;
static double area(double r) {
return pi * r * r;
}
}
в то время как следующее getCallCount
не является функцией:
class MyClass {
static int callCount = 0;
static int getCallCount {
return ++callCount;
}
}
В общем, изменяемые (не-final
) статические члены следует использовать с осторожностью — кто-то скажет, что их вообще не следует использовать — потому что они создают глобальное состояние для программы, что, вероятно, оказывается плохим выбором дизайна в долгосрочная перспектива. Есть исключения, но будьте осторожны...
Вам даже не нужны статические члены, чтобы сделать статические не-функции: System.nanoTime()
определенно не является чистой функцией (поскольку она возвращает разные значения при последовательных вызовах), хотя она обращается только к часам компьютера, а не к каким-либо статическим членам.
Как ни странно, вы также можете создавать нестатические чистые функции:
class MyClass {
final double pi = 3.14;
double area(double r) {
return pi * r * r;
}
}
Теперь, хотя это уже не static
, area
по-прежнему остается чистой функцией: она не затрагивает ничего, что могло бы измениться. Тот факт, что вам придется создать экземпляр MyClass
для доступа к area
, не снижает его «функциональности». Действительно, можно возразить, что такого рода чистые функции всегда следует делать статическими.
Рекомендую посмотреть эти видео для лучшего погружения в вопрос: