Java11 Mogę odwołać się do obiektu(dostep pakietowy) z innego pakietu przy użyciu słowa 'var'

0

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

2

dostęp do obiektu, do którego ta klasa nie powinna mieć dostępu

No bez przesady ;) Klasa co najwyżej nie powinna widzieć tego typu, ale nic więcej. Jeśli zrobisz sobie publiczny interfejs IModelData i ta twoja klasa będzie go rozszerzać, to spokojnie będziesz miał do niej dostęp za pomocą tego interfejsu. U ciebie też nie odnosisz się bezpośrednio do tego typu, tylko tworzy ci go factory.
Niemniej samo zachowanie jest ciekawe :)

0

Klasa co najwyżej nie powinna widzieć tego typu, ale nic więcej. masz racje, źle to ująłem :)
Przez przypadek zauważyłem to zachowanie i nie wiedziałem czy to bug czy feature :)

0

Zauważ że to ci w ogóle nic nie daje, bo np. nie zawołasz metody z tej klasy ani nic z nią nie zrobisz (chyba że refleksją). Niczym sie to nie różni tutaj od przypisania tego obiektu do Object.

edit: w sumie nawet gorzej, bo na tym var nie pozwoli ci nawet zawołać metod z Object.

0

@Shalom: zauwazyłem to, że nie mogę zawołać metod. Ale czy nie uważasz, że to powinno wyjść w czasie kompilacji?

0

Niby czemu? W sensie co by miało wyjść? Przecież mógłbyś zrobić sobie Object model = ModelFactory.createModel(); jak lubisz. Co by ci tutaj kompilator miał niby powiedzieć? Przypisanie które zrobiłeś jest zupełnie legalne, chociaż mało użyteczne.

0

Masz racje. Ta odpowiedz mnie satysfakcjonuje w 100% :) dzieki

1 użytkowników online, w tym zalogowanych: 0, gości: 1