
Володимир
26.09.2018
14:36:02

Yury
26.09.2018
14:39:43
Скажите где прочитать про такое поведение компилятора?
class A{
final int a = 1;
public int getA() {
return a;
}
}
A aObj = new A();
Field field = A.class.getDeclaredField("a");
field.setAccessible(true);
field.set(aObj, 2);
System.out.println(aObj.getA()); //1
System.out.println(aObj.a); //1
System.out.println(field.get(aObj));//2Если инициализировать в конструкторе, то везде 2.
Где можно про это прочитать?

elefus
26.09.2018
14:46:45

Nick
26.09.2018
14:50:49

Google

Yury
26.09.2018
14:51:28

Nick
26.09.2018
14:51:58
так ведь заинлайнено же

elefus
26.09.2018
14:52:10
Опередили)
Глянул на байткод getA() - там компилятор использовал "константность" final-поля и заинлайнил его
// access flags 0x1
public getA()I
L0
LINENUMBER 30 L0
ICONST_2
IRETURN
L1
LOCALVARIABLE this Lcom/epam/se01/A; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1

Nick
26.09.2018
14:52:17
вы думаете System.out.println(aObj.a); вот тут не видно что a финальное?
покажите байткод всего что у вас получается
а не только класса A
System.out.println(aObj.a);
это заменится на
System.out.println(1);

elefus
26.09.2018
14:53:23
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
POP
ICONST_2
INVOKEVIRTUAL java/io/PrintStream.println (I)V
все верно, компилятор в месте использования A.a подставил значение 2 сразу (ICONST_2)

Nick
26.09.2018
14:54:13
ICONST_2 = 1
это у вас еще в getA() есть

elefus
26.09.2018
14:54:38
не я топикстартер
я компилил с двойкой)

Nick
26.09.2018
14:55:00
упс) я чтот прозевал что отвечает другой)

Google

elefus
26.09.2018
14:55:03
ICONST_2 все-таки загружает интовое значение 2 на стек

Nick
26.09.2018
14:55:34
тогда не предметно разговор, может с 1 скомилите?

elefus
26.09.2018
14:56:01
ничего не изменится) отличаться будет только на ICONST_1

Nick
26.09.2018
14:56:20
эт да, зато путаницы не будет)

elefus
26.09.2018
14:57:35
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/lang/Object.getClass ()Ljava/lang/Class;
POP
ICONST_1
INVOKEVIRTUAL java/io/PrintStream.println (I)V
скомпилено с
final int a = 1;

Yury
26.09.2018
15:00:44
По идее это должно быть описано где то в java доках?

Nick
26.09.2018
15:01:23
а может просто не надо менять финальные поля?
и я уверен что описание всех спекуляций как на уровне компиляции так и в момент выполнения можно только в сырцах найти, никаких док не хватит

Yury
26.09.2018
15:03:45
Видимо поэтому jackson @JsonProperty не final поля. Тк инжектится рефлексией и будет такая вот оптимизация.

Nick
26.09.2018
15:10:28
так какой же он у вас иммутабельный если вы его меняете

Alexandr
26.09.2018
15:11:10

Yury
26.09.2018
15:16:21

Nick
26.09.2018
15:17:06
иммутабельный это когда конструктор завершил свою работу и после этого поля не меняются
что вам мешает создать действительно иммутабельный объект но через какойнить билдер или еще какую конструкцию с которой уже будете извращаться с рефлексией

Yury
26.09.2018
15:22:25

Nick
26.09.2018
15:23:00
private(не final) без сеттеров - вполне себе иммутабельность

Google

Yury
26.09.2018
15:23:13
Просто я хотел еще, чтобы какой-нибудь Вася не написал сеттер.
Ладно, спасибо вам за разбор!

Mikhail
26.09.2018
15:25:46
Сгенерь билдер идеей и всё

ARDEV
26.09.2018
15:26:15
\

Yury
26.09.2018
15:26:27
Со всеми вытекающими

Mikhail
26.09.2018
15:26:47

Yury
26.09.2018
15:28:13
Вообщем решение jackson с json мне вполне импонирует.

Oleksandr
26.09.2018
16:10:57
private(не final) без сеттеров - вполне себе иммутабельность
нет, это "прайват без сеттеров"
больше того, слегка расширяя сабж, штуки типа "а давайте лист завернем в обертку, в которой нет методов для изменения содержимого" тоже не иммутабельность (корректнее unmodifiable), а хак (иногда оправданный)

Nick
26.09.2018
16:15:47
тут наверное вопрос в чем отличие иммутабельности на финальных полях от иммуутабельности на прайватах с отсутвием сеттеров, но с финалом на классе

Oleksandr
26.09.2018
16:20:37
я больше о том, что слово "иммутабельность" слегка перегружено разными значениями, и для "финальных полей" его некорректно использовать
"неизменяемость ссылки" мб, хз

elefus
26.09.2018
16:26:07

Slava
26.09.2018
16:36:56
попытался сегодня запустить IDEA на openjdk11 (не с той jre, который идёт в комплекте с IDEA), получил ClassNotFoundException относительно swing . Знаю, что у IDEA свой пропатченный swing есть, кто знает как лечить проблему? подложить джарник в classpath ?
запускалось как
JAVA_HOME=/path/to/jdk11 $IDEA_PATH/bin/idea.sh

Vyacheslav
26.09.2018
16:39:24

Slava
26.09.2018
16:39:35
принято
спс

Google

Admin
ERROR: S client not available

Bogdan
26.09.2018
17:50:34

Oleg
26.09.2018
19:59:18
https://habr.com/company/jugru/blog/424543/

guga
26.09.2018
20:03:54

Oleg
26.09.2018
20:04:35
а шо с ним не так?

guga
26.09.2018
20:04:50
ну не с самим клиентом, а скорее с реквест билдером
собирать его с URI который собирать из строки
короче квери параметры делать через StringBuilder#append
выглядит как-то дико, с пол пинка не нашел ничего лучше, даже в гугл залез
Я конечно понимаю, что это штука просто для посылания реквестов и получения респонсов, но могли бы и нормальные реквест билдеры завезти

Artjom
26.09.2018
20:07:27
попытался один микросервис перевести на 10 у нас в поме используется docker-maven от спотифай, и с ним какие-то косяки в 11
вообще не сложилось по легкому перевести - полчаса посидел забил

Timur
26.09.2018
20:10:07
как то я с микросервисами выпал из java мира по 8ки и 9ки, что в 10тке то было?

Bogdan
26.09.2018
20:18:38

Timur
26.09.2018
20:27:32

Bogdan
26.09.2018
20:28:19
Тю ?
ну там еще что-то внутренее было, но вроде поламать ничего не должно

Timur
26.09.2018
20:29:00
Валхалу ещё не выложили?

Евгений
26.09.2018
21:38:59

Oleg
26.09.2018
21:41:05

Google

Евгений
26.09.2018
21:41:27
олег почему у меня джава не работает? :(

Oleg
26.09.2018
21:41:39

Евгений
26.09.2018
21:41:43
оО
ну лан

Alexey
26.09.2018
21:42:28
Это вдохновило меня на новое слово: CannotThrowExceptionError

Artjom
26.09.2018
21:42:52

Alexey
26.09.2018
21:43:13
А по теме, что это за исключение такое? Его Javac кидает?

Евгений
26.09.2018
21:43:22
да