Я новичок в языке Java. Я разработчик PHP. Там существует много Функции обработки переменных на языке php.
Но мне трудно представить, что нет встроенных функций, которые проверяют, является ли значение числовым, равно нулю и т. Д.
Кто-нибудь может объяснить, почему это так? Почему Java не предоставляет такие простые функции?
PHP позволяет хранить практически любое значение в любой переменной и при необходимости конвертировать между типами. Java не конвертирует автоматически между большинством типов — если вы хотите конвертировать, вы должны сделать это самостоятельно.
Все is_something
функции были бы бессмысленными — вы знаете тип переменной, так как вы ее объявили!
Если у вас есть ссылка на объект, вы можете определить тип объекта (не переменная), что это относится к использованию instanceof
или отражение:
Object x = "hello";
// the variable x is of type Object, but it refers to a String. How can we tell?
System.out.println(x instanceof Integer); // prints "false"System.out.println(x instanceof String); // prints "true"System.out.println(x.getClass().getName()); // prints "java.lang.String"
Тем не менее, в большинстве случаев это просто не то, что вам нужно делать.
Итак, все is_something
функции не нужны, и все somethingval
функции не очень хорошо вписываются в язык (хотя по техническим причинам они не могут существовать). Что еще там?
get_defined_vars
— опять же, излишним. Вы знаете, какие переменные определены, потому что вы их определили!
empty
(возвращает true, если переменная не существует или содержит false). Использование переменной, которая не существует, является ошибкой во время компиляции, поэтому вы можете просто использовать thing == false
(или же !thing
если это булево) вместо empty(thing)
,
get_resource_type
— самое близкое совпадение в Java thing.getClass().getName()
вместо get_resource_type(thing)
,
gettype
— бесполезно по той же причине is_something
функции бесполезны.
import_request_variables
— Язык Java не имеет встроенной концепции переменных GET, переменных POST или файлов cookie. Даже если бы это было так, это не сработало бы очень хорошо, потому что вам все равно пришлось бы объявлять все переменные.
is_null
— использовать thing == null
вместо is_null(thing)
,
isset
— опять же, вы не можете использовать переменные, которые не существуют. Так что просто используйте thing != null
вместо isset(thing)
,
serialize
а также unserialize
Java имеет систему сериализации, которая является более сложной, но более гибкой. Уважать ObjectOutputStream
а также ObjectInputStream
,
settype
— не имеет смысла, так как тип переменной не может быть изменен.
strval
— использовать String.valueOf
,
unset
— не имеет смысла. Переменные существуют до конца их области действия.
print_r
а также var_dump
а также var_export
— единственные, которые могут быть полезны и не существуют. К сожалению, его просто не существует, хотя вы можете получить нечто похожее, если переопределите toString во всех ваших классах.
Но я представляю, что любая функция сборки не проверяет, является ли значение числовым, равно нулю и т. Д.
Почему Java не предоставляет такие простые функции, как это?
Первая причина: Java поддерживает перегрузку методов.
В Java вы обычно не пишете ни одного метода, который обрабатывал бы все виды аргументов со всеми видами различных типов. Вместо этого вы можете написать несколько перегрузок одного и того же метода: одно и то же имя метода с разными объявленными типами аргументов и / или разным количеством объявленных аргументов.
Компилятор перебирает во время компиляции какой перегруженный метод вызывать на основе статических типов выражений аргументов.
В этой модели не требуется набор функций для определения, являются ли значения числовыми, нулевыми и так далее.
Вторая причинаJava не допускает взаимозаменяемости примитивных типов и типов объектов.
Например, вы не можете объявить тип аргумента, который бы принимал как int
значение и String
значение. И int
тип аргумента никогда не может принять null
,
(На самом деле, примитивные классы-оболочки, такие как Integer
и добавление Java 5 в автоматическую коробку / распаковку, как правило, стирает различие. Но основное различие между примитивными и ссылочными типами остается. Автобокс это синтаксический сахар.)
Третья причина: Есть instanceof
и тестирование для == null
,
Как отмечает @Malik, в тех случаях, когда тесты имеют смысл в Java, они могут быть реализованы с помощью встроенных конструкций, не прибегая к библиотечным «функциям». Функции не нужны.
(AFAIK, ни одна сторонняя служебная библиотека сторонних производителей не реализовала эквивалент функций PHP, о которых вы говорите … который поддерживает представление о том, что они не нужны. Если бы достаточное количество людей считали, что функции были необходимы, была бы библиотека, и мы узнал бы об этом.)
Стоит также отметить, что большинство «функций обработки переменных» связано с динамически объявленными переменными в PHP. Java не поддерживает это. Если вы хотите реализовать динамическое связывание между именами (строками) и значениями в Java, используйте Map
учебный класс.
PHP, как вы знаете, не заботится о том, что вы храните в переменной, вы объявляете имя, присваиваете ему значение, и оно будет пытаться интерпретировать его само. В Java вы явно объявляете тип переменной, который вам нужен.
Что-то вроде целого числа (целое число) может быть представлено примитивным типом данных int
так что вы могли бы использовать
int myNumber = 7;
И код наверняка будет знать, что это целое число, поскольку вы прямо заявили, что это так. Ссылаться на эта страница для других примитивов Java.
Если вы используете строку (которая является объектом) в Java, вы можете использовать функцию isEmpty (), чтобы определить, есть ли в ней какие-либо символы. Вы можете проверить объекты в Java, чтобы увидеть, были ли они созданы с помощью object == null.
Некоторые компиляторы на самом деле будут предупреждать вас, если вы не инициализировали переменные, прежде чем проверять их, будь то объекты или примитивы.
Чтобы получить представление о том, как работают типы данных в Java, обратитесь к документации Oracle, которую я связал, это очень полезно и содержит мало информации о других аспектах Java, с которыми у вас могут возникнуть вопросы.
Прежде всего, зачем проверять тип переменной, когда вы явно определяете переменную с типом. Во-вторых, вы можете проверить тип в Java, хотя вы уже должны знать тип.
Integer x = 3;
if (x instanceof Integer) {
System.out.println("Integer");
}
String s = "test";
if (s instanceof String) {
System.out.println("String");
}