Używając słowa kluczowego var z JDK11 mogę uzyskać dostęp z zewnętrznego pakietu.
W pliku .class w Service.class chroniony obiekt ModelData
jest importowany z pakietu zewnętrznego. Ale nie powinno.
Poniżej przykład:
package service.test;
import service.test.model.ModelFactory;
public class Service {
void test(){
var modelDataVar = ModelFactory.createModel();
}
}
package service.test.model;
public class ModelFactory {
public static ModelData createModel(){
return new ModelData();
}
}
package service.test.model;
class ModelData {
private String name;
ModelData(){
this.name = "Test";
}
}
Jeżeli użyje słowa kluczowego var
poniższy test przechodzi:
package service.test;
import org.junit.jupiter.api.Test;
import service.test.model.ModelFactory;
class ServiceTest {
@Test
void test(){
var model = ModelFactory.createModel();
System.out.println(model);
}
}
Jeżeli zdefiniuje typ zmiennej, dostaję błąd (oczekiwane, prawidłowe i normalne zachowanie)
package service.test;
import org.junit.jupiter.api.Test;
import service.test.model.ModelFactory;
class ServiceTest {
@Test
void test(){
ModelData model = ModelFactory.createModel();
System.out.println(model);
}
}
Error:(13, 9) java: cannot find symbol
symbol: class ModelData
location: class service.test.ServiceTest
Pytanie JDK nie zgłasza błędu, ze nie może znaleźć symbolu przy użyciu słowa var, w pliku Service.class
jest zadeklarowany dostęp do obiektu, do którego ta klasa nie powinna mieć dostępu