Зачем усложнять импорт в джава?

Ведь можно написать import java.util.*, зачем тогда писать import java.util.Scanner? Ведь полный импорт занимает меньше памяти и функциональнее.


Ответы (4 шт):

Автор решения: Nowhere Man

Использование полных названий классов в импортах -- больше вопрос стиля, например в Google Code Style §3.3 указано:

3.3.1 No wildcard imports
Wildcard imports, static or otherwise, are not used.

Основная причина для такого запрета -- избежать случайного импорта ненужных классов, что может приводить к нежелательным конфликтам названий классов из разных пакетов. Наиболее яркий пример: при импорте java.util.*; возникнет коллизия между java.util.Date и его реально используемым наследником java.sql.Date.

Аналогичный вопрос на основном SO (2008 г.): Why is using a wild card with a Java import statement bad?

Что касается утверждения:

Ведь полный импорт занимает меньше памяти и функциональнее.

Оператор импорта по сути является синтаксическим сахаром для сокращения полных имён классов, а не аналогом директивы препроцессора #include в С/С++. Импорт всего пакета или одного конкретного класса может повлиять на время компиляции, но не на время исполнения (производительность) программы, так как сгенерированный байткод не будет отличаться.

Аналогичный вопрос на основном SO (2011 г.): Performance difference between a wild card import and the required class import

→ Ссылка
Автор решения: Зонтик

Вопрос интересный, и я постараюсь ответить на него простым языком. Импортировать все классы из пакета допустимо лишь в том случае, когда из этого пакета используется очень много классов. Например, это выглядит не очень:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.SpringLayout;
import javax.swing.JTextArea;

Это даже не половина классов из javax.swing, но в данном случае будет лучше импортировать все классы:

import javax.swing.*;

Если же вы используете не так много классов из пакета, пишите полные импорты.

В этом есть несколько преимуществ:

  1. Другой программист поймёт, для чего именно этот импорт нужен.
  2. Не будет никаких "сюрпризов" (про это уже говорил @NowhereMan, но я приведу свой пример):
import java.util.*;
import javax.swing.*;

public class Test {
  public static void main (String [] args){
    Timer timer = new Timer(); // Ошибка! Ссылка на класс Timer неоднозначна!
  }
}

Этот код не будет компилироваться, ведь есть как java.util.Timer, так и javax.swing.Timer.

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

→ Ссылка
Автор решения: стасевич

если ты напишешь import java.lang.*; то увидишь следующее

Remove this unnecessary import: java.lang classes are always implicitly imported.  

пакет java.lang подтягивается автоматически, неявно.
по аналогии, как все классы наследуются от java.lang.Object
если ты напишешь к примеру public class UserEntity extends Object
то, увидишь Class 'UserEntity' explicitly extends 'java.lang.Object'

для работы приложения ты будешь добавлять библиотеки(зависимости)
вот для примера зависимости в простом приложении
введите сюда описание изображения
и вот какие библиотеки проект подтягивает, даже половина на экран не влезла
введите сюда описание изображения
и у тебя вовремя кодинга возникнут конфликты, вот я создал класс юзер
введите сюда описание изображения у тебя спросят - какой из них надо добавить!??
импорт по имени, разрешает(устраняет) конфликт классов, т.е. ты говоришь электронному балвану(jvm) какой именно класс тебе нужен. вот для этого и нужен импорт, чтобы уточнить какой именно класс надо использовать

→ Ссылка
Автор решения: Zhenyria

Я лишь хочу добавить, что система пакетов в Java служит в качестве системы пространства имён.

Пространство имён - это некое хранилище множества имён (в данном случае классов), которое необходимо для логической группировки некоторых сущностей, а также помогает отличать их от сущностей с таким же названием, но из другой группы сущностей.

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

А импорт всего пакет по сути убивает смысл пространства имён, так как, как уже написали ранее, если в двух пакетах будут одинаковые классы, то мы не сможем их различить.

→ Ссылка