Я вижу прирост производительности при использовании оператора getClass()
и оператора.==
instanceOf
Object str = new Integer("2000");
long starttime = System.nanoTime();
if(str instanceof String) {
System.out.println("its string");
} else {
if (str instanceof Integer) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
starttime = System.nanoTime();
if(str.getClass() == String.class) {
System.out.println("its string in equals");
} else {
if(str.getClass() == Integer.class) {
System.out.println("its integer");
}
}
System.out.println((System.nanoTime()-starttime));
Есть ли какие-то рекомендации, какие использовать getClass()
или instanceOf
?
Учитывая сценарий: Я знаю точно классы должны быть совпавшие, то есть String
, Integer
(это конечные классы) и т.д.
Использование instanceOf
оператора - плохая практика?
java
class
instanceof
капля
источник
источник
Ответы:
Причина, по которой производительность
instanceof
иgetClass() == ...
отличается, в том, что они делают разные вещи.instanceof
проверяет, является ли ссылка на объект в левой части (LHS) экземпляром типа в правой части (RHS) или каким-либо подтипом .getClass() == ...
проверяет идентичность типов.Поэтому рекомендуется игнорировать проблему производительности и использовать альтернативу, которая дает вам нужный ответ.
Не обязательно. Чрезмерное использование любого из них
instanceOf
илиgetClass()
может быть «дизайнерским запахом». Если вы не будете осторожны, вы получите проект, в котором добавление новых подклассов приведет к значительному изменению кода. В большинстве случаев предпочтительным подходом является использование полиморфизма.Однако бывают случаи, когда это НЕ «дизайнерский запах». Например,
equals(Object)
вам нужно проверить фактический тип аргумента и вернутьfalse
его, если он не совпадает. Лучше всего это делать с помощьюgetClass()
.Такие термины, как «передовой опыт», «плохая практика», «запах дизайна», «антипаттерн» и т. Д. Следует использовать осторожно и относиться к ним с подозрением. Они поощряют черно-белое мышление. Лучше делать свои суждения в контексте, а не основываться исключительно на догмах; например, то, что кто-то сказал, является «лучшей практикой».
источник
code smell
должен использовать то же самое. Это означает, что это следствие плохого дизайна (неполиморфного) кода, который заставляет вас использовать любой из них. могу ли я сделать вывод об использовании любого из них таким образом?instanceof
&getClass()
появляется из-за существующего плохого дизайна (неполиморфного) кода. я прав?instanceof
(например) является плохим дизайном. Бывают ситуации, когда это может быть лучшим решением. То же самое дляgetClass()
. Повторюсь, я сказал «злоупотреблять», а не «использовать» . Каждый случай необходимо рассматривать по существу ... а не слепо применяя какое-то необоснованное догматическое правило.Вы хотите точно сопоставить класс , например, только сопоставление
FileInputStream
вместо любого подклассаFileInputStream
? Если да, используйтеgetClass()
и==
. Я обычно делал это в aequals
, чтобы экземпляр X не считался равным экземпляру подкласса X - иначе вы можете столкнуться с сложными проблемами симметрии. С другой стороны, это обычно более полезно для сравнения того, что два объекта относятся к одному классу, чем к одному конкретному классу.В противном случае используйте
instanceof
. Обратите внимание, чтоgetClass()
вам нужно будет убедиться, что у вас есть ненулевая ссылка для начала, иначе вы получитеNullPointerException
, тогда какinstanceof
просто вернетесь,false
если первый операнд равен нулю.Лично я бы сказал, что
instanceof
это более идиоматично, но широкое использование любого из них в большинстве случаев является запахом дизайна.источник
Я знаю, что это было давно, но вчера я узнал альтернативу
Мы все знаем, что вы можете:
но что, если вы не знаете, какой именно класс это должен быть? в целом вы не можете:
поскольку это дает ошибку компиляции.
Вместо этого есть альтернатива - isAssignableFrom ()
Например:
источник
isAssignableFrom
. Правильный способ записиo instanceof String
с использованием отражения -String.getClass().isInstance(o)
. В документации javadoc даже сказано: этот метод является динамическим эквивалентомinstanceof
оператора языка Java .getClass () имеет ограничение, заключающееся в том, что объекты равны только другим объектам того же класса, того же типа времени выполнения, как показано в выводе кода ниже:
Выходы:
SubClass расширяет ParentClass. subClassInstance - это instanceof ParentClass.
Различные методы getClass () возвращают результаты с subClassInstance и parentClassInstance.
источник