статические методы делают Java псевдо функциональным языком?

Вы можете попробовать что-то вроде этого, чтобы показать вывод на китайском,

        OutputStream outputStream = System.out;
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

        String chineseFromCode = nm_chinese;
        bufferedWriter.write(chineseFromCode);
        bufferedWriter.flush();
7
задан Joachim Sauer 25 February 2009 в 14:02
поделиться

6 ответов

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

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

Однако это не означает, что Вы не можете программировать в функциональном стиле на императивном языке как Java. Другие примеры могут быть даны также. Именно, не потому что Вы программируете в Java, Вы делаете ООП. Можно программировать с глобальными данными и неструктурированными потоками управления (goto) на структурированном языке как C++. Я могу сделать ООП на функциональном языке как Схема. И т.д.

Steve McConnell упоминает различие программирования на языке по сравнению с программированием на язык в Завершенном Коде (также очень популярная ссылка на ТАК).

Так, короче говоря, если Вы говорите, что "статические методы подражают первоклассным функциям", я не соглашаюсь.

Если, однако, и я буду думать, что это было больше точкой, которую Вы пытались объяснить, то Вы скажете, что "статические методы могут помочь для программирования в функциональном стиле в Java", я соглашаюсь.

3
ответ дан 7 December 2019 в 01:27
поделиться

Статические методы делают тестирование трудно, потому что они не могут быть заменены, это настолько просто.

Как статические методы могут "подражать" функциям как первому классу objects1? Возможно они хуже, чем что-либо еще на этой передней стороне. Можно "подражать" функциям, поскольку первый класс возражает путем создания интерфейсов отдельного метода, и действительно Наборы Java Google делают точно это во многих местах (для предикатов, проекции и т.д.). Это не может быть сделано со статическими методами - нет никакого пути (кроме с отражением) для передачи понятия, "когда Вы хотите применить функцию, используйте этот метод.

Нет, я не вижу, как статические методы помогают здесь. Они препятствуют изменению состояния (поскольку единственное доступное состояние является глобальным состоянием и любым изменяемым состоянием, переданным на пути параметры), но они не помогают на "функциях как сторона" объектов первого класса.

C# имеет лучшую поддержку этого (с лямбда-выражениями и делегатами), но даже это не является столь общим, как это могло бы быть. (Сравните его с F#, например.)


1 С Java 8, ссылки метода позволят методам быть преобразованными в экземпляры соответствующих интерфейсов отдельного метода, которые сделают все это более релевантным. Назад в 2009 это было далеко хотя...

4
ответ дан 7 December 2019 в 01:27
поделиться

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

0
ответ дан 7 December 2019 в 01:27
поделиться

Функциональный! = функция, и для записи я буду утверждать что метод! = функция...

Java является объектно-ориентированным языком со статическим контролем типов. Java также поддержал относительную чистоту тем способом, но это не где около функционального языка.

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

C++ имеет функции, но C++ также имеет классы. C++ поэтому имеет два типа функций, функций членства и функций. Когда Вы говорите метод значение функции членства. Поскольку метод вызывается на экземпляр объекта. Но когда Вы говорите статический метод значение просто функции (в смысле C/C++). Это - просто словарь для обращения к элементам Вашего кода. И в Java код не может существовать вне класса, метод подразумевал бы, что принадлежит некоторому классу т.е. типу.

До сих пор ничто из того, что я сказал, не касается функционального программирования, но я думаю, что Вы понимаете где Вы неправильно.

Я предлагаю, чтобы Вы посмотрели на чистые языки функционального программирования, такие как Haskell или Erlang. Поскольку языки функционального программирования обычно не имеют closers также.

Ваше заявление, что статические методы могут использоваться для имитации функций как объектов первого класса, звучит действительно причудливым мне. Это больше походит на язык динамического программирования, чем функциональное программирование.

3
ответ дан 7 December 2019 в 01:27
поделиться

В Java Вы не можете дать функцию как аргумент другой функции.

На функциональном языке, если у Вас есть функция

def addOne(i) = i + 1

Вы можете передать это другой функции это, например, применяете ее ко всем элементам списка.

В Java, с

public static int addOne(int i) { return i + 1; }

нет никакого способа сделать это.

0
ответ дан 7 December 2019 в 01:27
поделиться

Если Вы только используете статические методы затем, Вы программируете в процедурном, необъектно-ориентированном стиле.

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

0
ответ дан 7 December 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: