Как ограничить видимость / доступность метода для подпакета в java 8? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь понять, есть ли у нас в Java 8 возможность ограничить видимость / доступность метода для подпакета?

Например, если у меня есть метод print ( ) класса A в пакете ab c. Теперь, как я могу ограничить доступ к этому методу только в подпакетах ab c, таких как ab c .def или ab c .def.ijk et c.

1 Ответ

3 голосов
/ 06 мая 2020

В языке такой возможности нет. Один из вариантов достижения этого - инкапсулировать действие в тип publi c и аккуратно опубликовать sh его в предполагаемом пакете. Например,

package abc;

import java.util.function.Consumer;

import abc.def.B;
import java.lang.Objects;

public class A {
    public static Consumer<A> getPrintAccess(B.AccessToken token) {
        Objects.requireNonNull(token);
        return A::print;
    }

    private void print() {
        System.out.println("privileged action");
    }
}
package abc.def;

import abc.A;

public class B {
    public static class AccessToken {
        /* non-public */ AccessToken() {}
    }

    void someMethod(A object) {
        A.getPrintAccess(new AccessToken()).accept(object);
    }
}

Хотя метод getPrintAccess является общедоступным, он предоставит доступ только к коду, способному создавать экземпляры abc.def.B.AccessToken. Поскольку его конструктор является частным для пакета, это может сделать только код в пакете abc.def. Конечно, код в этом пакете не должен передавать экземпляр AccessToken ненадежному коду.

...