Popatrz na przykład:
package com.jadevirek.eventbooking.model.converters;
public class OverTheHood {
public static void main(String[] args) {
// ponizszy kod totalnie nie ma sensu, gdyz tworzy Ci lokalny obiekt/instancje typu InterFace
// Widziany tylko w zakresie lokalnym, stad wszystko co lokalnie deklarowane jest widziane lokalnie.
var test = new InterFace() {
private int count = 0;
public int defaultCount = 100;
};
overTheHoodMethod(test);
System.out.println(test.count);
System.out.println(test.defaultCount);
}
private static void overTheHoodMethod(InterFace test) {
//Brak dostepu do wlasciwosci. nawet publicznej...
// gdyż nie są one czescia interfejsu...
System.out.println(test);
var test2 = test;
}
}
interface InterFace {
}
Var sciagą Ci typ, tak naprawdę w zakresie lokalnym twoja instancja staje się "bez-płciowa", nie ma znaczenia jaki ma Typ gdyż przez to że jest on przypisany to var - traci swoje właściwości, a jedynie staje się obiektem lokalnym, a wszystko w zakresie lokalnym jest w zakresie hermetycznym więc jest widzialne przez program.
Jeśli typ byłby zachowany i dalej referencja przypisana do słówka "var" byłaby rozpoznawana, wtedy pro paginując zmiany do innej metody obiekt byłby rozpoznawalny i możliwy byłby dostęp do publicznego pola, a nie jest... gdy przekazując zmienna, przekazana jest tylko znajomość LOKALNEGO TYPU, a skoro zewnętrzny interfejs (jako typ) nie ma właściwości, to jego lokalna instancja jak kolega napisał zwana klasą anonimową nie może zostać przekazana, gdyż java PRZEKAZUJE WARTOŚC REFERENCJI do typu, a nie obiekt/instancje bezpośrednio.
Ten zapis ze słówkiem kluczowym var nie ma totalnie sensu i zastosowania a jak już słusznie zostało powiedziane jest to błąd składni a dlaczego dlatego że tworzymy klasę anonimową którą moglibyśmy wykorzystać do nadpisywania jakichś zmian w danym kontekście lub skorzystania z proxy których nie możemy wykorzystać przez to gdyż przypisujemy je do zmiennej var.
Klasy anonimowe są dobre kiedy chcemy zablokować jakieś mechanizmy refleksji lub skorzystać z jakiegoś dynamicznego nadpisania zachowania ale to działa i tak tylko i wyłącznie lokalnie dlaczego prywatne właściwości w takim razie są dostępne i widziane lokalnie dlatego że lokalny zakres jest prywatny i Java dobrze wie że ten obiekt poza nie istnieje szczególnie gdy jest przypisany do war
Ważny inny przypadek, żebyś zrozumiał czym w ogółem jest typ referencyjny i dlaczego to takie istotne w kontekście zakresu dostępu.
public class OverTheHood {
public static void main(String[] args) {
var test = new InterFace() {
private int count = 50;
public int defaultCount = 100;
@Override
public int someCalculation() {
return count+defaultCount;
}
};
System.out.println(test.count);
System.out.println(test.defaultCount);
System.out.println(test.someCalculation());
overTheHoodMethod(test);
}
// Z faktu, ze java to jezyk obiektowy silnie typowany i zmienne sa wskaznikami do
// wartosci referencji, a nie sama referencja. Dalej
private static void overTheHoodMethod(InterFace test) {
// w tym wypadku staje się to dosyć niebezpieczne.
System.out.println("From over-theHood.");
System.out.println(test.someCalculation()); //150
var assignTest= test;
// jednak w tym wypadku nie mozna wywolac juz metody...
// test.someCalculation()
}
}
interface InterFace {
int someCalculation();
}