Кирилл Темненков @General_Manjago
бекенд разработчик на Java и Kotlin
Information
- Rating
- Does not participate
- Location
- Москва и Московская обл., Россия
- Works in
- Date of birth
- Registered
- Activity
Specialization
Backend Developer
Lead
Java
High-loaded systems
А если некий пользователь-зловред специально пометит оппонента, как бота (и он автоматически так идентифицируется на всех остальных ресурсах)? Предусмотрен ли какой-нибудь механизм защиты?
Хотя действительно — в случае сложного свитча (как у вас в примере) «протестного чувства» практически нет :-)
import java.io.PrintStream;
public class Test3
{
public static void main(String[] paramArrayOfString)
{
String str1 = "6R";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case 1756:
if (str2.equals("5q")) { i = 2; } else { if (!str2.equals("6R")) break; i = 0; } break;
case -1386582880:
if (!str2.equals("blabla")) break; i = 1; } switch (i) {
case 0:
case 1:
System.out.println("Ok");
break;
case 2:
System.out.println("Fail");
}
}
}
Теперь можно посмотреть на Test2 — малость поинтереснее.
Исходник:
public class Test2 {
public static void main(String[] args) {
String test = "6R";
switch(test){
case "6R":
System.out.println("Ok");
break;
case "5q":
System.out.println("Fail");
break;
}
}
}
Результат декомпиляции:
import java.io.PrintStream;
public class Test2
{
public static void main(String[] paramArrayOfString)
{
String str1 = "6R";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case 1756:
if (str2.equals("5q")) { i = 1; } else { if (!str2.equals("6R")) break; i = 0; } }
switch (i) {
case 0:
System.out.println("Ok");
break;
case 1:
System.out.println("Fail");
}
}
}
Разумеется, возможны коллизии.
Впрочем, посмотрел для очистки совести и другим, более «низкоуровневым» — и, насколько я понял, там та же «пляска» с хешем и сравнением строки:
С английским — да, грешен :-(
Но вообще забавно. Надо будет посмотреть, сколько будут «стоить» эти новые синтаксическо-сахарные фичи.
Мне давно хотелось в java использовать string в switch
Исходник:
public class Test {
public static void main(String[] args) {
String test = "string0";
switch(test){
case "string0":
System.out.println("It's works!");
break;
}
}
}
Компилируем седьмой жабой — компилится, работает!
Смотрим декомпилером Test.class:
import java.io.PrintStream;
public class Test
{
public static void main(String[] paramArrayOfString)
{
String str1 = "string0";
String str2 = str1; int i = -1; switch (str2.hashCode()) { case -1881759169:
if (!str2.equals("string0")) break; i = 0; } switch (i) {
case 0:
System.out.println("It's works!");
}
}
}
Забавно они эту фичу реализовали.
Тогда погодим покупать вторую версию, дождемся третьей :-)
kirill.temnenkov@gmail.com