Самый короткий ответ, вероятно, будет «определение - исполнение», поэтому весь аргумент не имеет строгой точки зрения. В качестве более надуманного примера вы можете привести следующее:
def a(): return []
def b(x=a()):
print x
. Надеюсь, этого достаточно, чтобы показать, что не выполнять выражения аргументов по умолчанию во время выполнения инструкции def
не просто или не работает, т. е. смысл, или и то, и другое.
Я согласен с тем, что при попытке использовать конструкторы по умолчанию, это будет gotcha.
повлияет на производительность моего кода (например, программа будет медленнее)?
blockquote>Нет, это не повлияет на производительность вашего кода.
Бинарные файлы (файлы классов) не увеличиваются в размере, поскольку импорт not реализован с помощью любого механизма вырезания и вставки.
Это просто синтаксический сахара, чтобы избежать необходимости писать, например
java.util.List<java.math.BigInteger> myList = new java.util.ArrayList<java.math.BigInteger>();
Вот небольшой тест, демонстрирующий это:
aioobe@e6510:~/tmp$ cat Test.java import java.util.*; public class Test { public static void main(String[] args) { List<Integer> myInts = new ArrayList<Integer>(); } } aioobe@e6510:~/tmp$ javac Test.java aioobe@e6510:~/tmp$ md5sum Test.class 523036e294b17377b4078ea1cb8e7940 Test.class
(изменение
Test.java
)aioobe@e6510:~/tmp$ cat Test.java public class Test { public static void main(String[] args) { java.util.List<Integer> myInts = new java.util.ArrayList<Integer>(); } } aioobe@e6510:~/tmp$ javac Test.java aioobe@e6510:~/tmp$ md5sum Test.class 523036e294b17377b4078ea1cb8e7940 Test.class
Является ли логика импорта в Java такой же, как и в C?
blockquote>Нет,
#include
является директивой препроцессора и реализуется с помощью cut-and -пастевый механизм.
Это не повлияет на скорость выполнения вашей программы.
Это может повлиять на скорость компиляции вашей программы.
Если вы import java.util.*;
загрузите весь пакет java.util в компилятор, что может увеличить время компиляции, когда вы .*
весь пакет для одного использования (хотя вы должны выполнить некоторые профилирования, если это будет проблемой .)
Помимо проблем с компиляцией потенциала , не забывайте учитывать проблемы читаемости. Как правило, я (и люди, с которыми я разговаривал) нахожу import pack.age.Class;
более читабельным, чем import pack.age.*;
- поговорите с вашей командой, прежде чем принимать решение об этом.
Но логика за ним сильно отличается от #include
и не раздувает код. Вы можете оказаться в более чем необходимо, поскольку вы включаете банки с зависимостями, но это, вероятно, не большая проблема.
import
не замедляет вашу программу. Лучше иметь разные типы classes
в разных packages
и импортировать их по мере необходимости. Улучшает читаемость кода.
... повлияет ли это на производительность моего кода
blockquote>Не в малейшей степени. Фактически, скомпилированные классы (с использованием импорта или нет) будут идентичными. Импорт - это просто синтаксический сахар, который позволяет использовать более короткое имя для внешнего класса или (со статическим импортом) класса в исходном коде. Другими словами, он позволяет вам писать:
Map map = new HashMap();
вместо
java.util.Map map = new java.util.HashMap();
Это все.
Существует потенциально небольшой (крошечный ) разница в сбор времени. Но AFAIK, что-то вроде
import java.util.*;
, НЕ приводит к тому, что все классыjava.util
загружаются компилятором. Скорее, он просто добавляет имена классов в таблицу символов.Сказав это:
- Ненужные импорты - плохая идея, потому что они заглушают код и могут ввести в заблуждение кого-то, читающего код.
- Импорт подстановок (
.*
) может привести к неожиданным столкновениям.- Множество людей (включая меня) не любят шаблон импортируется, потому что они предпочитают видеть список используемых фактических классов.
Является ли логика импорта в Java такой же, как и в C?
blockquote>Нет, это не так.
В директиве C / C ++ директива вводит произвольный код 1 C / C ++ в исходный поток. Это может включать объявления и исполняемые операторы ... которые могут влиять как на производительность, так и на объем исполняемой памяти и размер исполняемого файла.
1 - То есть независимо от того, какие авторы файла include выбрали положить в файл. Это может быть простой метод и класс «подписи», но также могут быть макросами, кодами и другими объявлениями. Вы должны проверить файл, чтобы убедиться.
Импорт не является проблемой. Вы можете импортировать все, что хотите, из пакета, а выполнение вашего кода не будет замедляться. import для удобства, поэтому вы можете использовать более короткие имена.
Классы загружаются, когда их конструктор называется неявным или явно (новый оператор). В случае перечислений это будет когда вы ссылаетесь на имена переименования в вашем коде. Это приведет к загрузке класса (enum). (Вы можете попробовать использовать println в приватном конструкторе enum для эксперимента и посмотреть, когда загружается enum). Загрузка класса требует времени и памяти. Обычно загруженные классы не предназначены для разгрузки.