Зависимость между классами без явного импорта - PullRequest
0 голосов
/ 14 мая 2018

Давайте рассмотрим эту простую иерархию классов в Java:

класс A:

package a;

import b.B;

public class A {
    public B a() {
        return new B();
    }
}

класс B:

package b;

public class B {
    public void b() {
        System.out.println("B!");
    }
}

класс Main:

import a.A;

public class Main {
    public static void main(String[] args) {
        A a = new A();
        a.a().b();
    }
}

Как видно, существует только прямой импорт A из класса Main. Однако мы вызываем метод b, возвращаемый из A.a(). Мои вопросы: хотя у нас нет прямой зависимости импорта между Main и B, считаются ли они все еще напрямую зависимыми? например, когда я анализирую зависимости между классами?

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

При компиляции компилятор связывает зависимости.

Это означает, что, поскольку a.A используется и импортируется, импорт из a.A также добавляется в компиляцию (или связывание, IIRC).

Таким образом, если вы посмотрите на получившийся файл .class, вы увидите, что он импортирует b.B.

Итак, чтобы ответить на ваш вопрос: на уровне Java они косвенно зависимы. после компиляции - напрямую зависит.

(Я могу ошибаться, но это мое понимание этого. Если кто-то знает лучше, во что бы то ни стало поправьте меня: D)

0 голосов
/ 14 мая 2018

Да, это прямая зависимость. Вам просто не нужно указывать это компилятору, потому что он может посмотреть на сигнатуру метода, который возвращает B и разрешит класс для вас.

Если компилятор не может найти B (или метод, который вы хотите вызвать для него), вы получите ошибку во время компиляции об отсутствующем классе.

Во время выполнения, когда вы загружаете класс, он также загружает все классы, указанные в сигнатурах методов (и завершается ошибкой, если они не могут быть найдены).

Также обратите внимание, что сами операторы import предназначены только для компилятора. Они не влияют на полученный файл класса. Это означает, что если вы импортируете десять классов, которые затем не используете, они не станут зависимостями (компилятор все равно будет жаловаться на их отсутствие в разделе импорта, но они не будут загружены во время выполнения).

...