Должны ли вы полностью определять префикс пакета при использовании ThreeTen-Backport по сравнению с java.time?

В нашем проекте мы используем Three Ten Backport, так как один из наших клиентов использует Java 7. Three Ten Backport дает нам новую функциональность даты и времени (java.time.*), представленную в Java 8.

Я хотел бы знать, является ли следующая хорошая практика. Поскольку большинство наших клиентов используют Java 8, и однажды мы можем обновить всех клиентов до Java 8, действительно ли имеет смысл полностью уточнять имена классов с помощью org.threeten.bp? В конце концов мы можем перевести всех клиентов на Java 8 и удалить эту зависимость, и если мы в конечном итоге сделаем это, то будет меньше изменений в коде, если мы просто будем использовать имена классов без префикса пакета. Чтобы привести пример кода, я имею в виду следующее.

import org.threeten.bp.LocalDate Time;

public class Example {

     public void example() {
          LocalDateTime datetime = // ....
     } 
}

Вы можете видеть в примере, что я ссылаюсь на LocalDateTime без префикса пакета. В Java 8 будет ли загружен класс java.time.LocalDateTime или класс org.threeten.bp.LocalDateTime? Это немного неясно, поскольку в этом коде в Java 8 плавают два LocalDateTime, один из java.time, а другой из org.threeten.bp. Я предполагаю, что нативная библиотека Java будет иметь приоритет и загружена, но могу ошибаться.

Это хорошая практика? Или он может генерировать предупреждения/ошибки компилятора? Даже если он не генерирует никаких предупреждений или ошибок, может ли это быть плохой практикой? Я испытываю искушение сделать это, потому что полное определение класса пакетом просто уродливо, и если мы в конечном итоге удалим зависимость Three Ten, нам придется изменить каждый экземпляр этого кода, а не просто удалить операторы импорта. Рад слышать ваши мысли.


person ktm5124    schedule 30.11.2018    source источник
comment
Если вы не импортировали пакет java.time, вы не будете использовать его классы.   -  person Jakg    schedule 01.12.2018
comment
Я лично думаю, что причина, по которой они используют одни и те же имена классов, заключается в том, что это делает миграцию на Java 8 Date and Time API действительно простой. В конце концов, это бэкпорт, а не только библиотека. Я бы не стал использовать полные имена классов, так как это сводит на нет все преимущество, если классы имеют одно и то же имя. Вместо этого я бы использовал простые имена классов, а при переходе на Java 8 вы просто заменяете импорт.   -  person MC Emperor    schedule 01.12.2018
comment
Кроме того, в дополнение к комментарию @Jakg автоматически импортируются только все классы из пакета java.lang. java.timejava.lang, вам не нужно беспокоиться о конфликтах импорта или о чем-то подобном.   -  person MC Emperor    schedule 01.12.2018
comment
Ваше использование импорта разумно. Нет необходимости полностью квалифицировать классы. ThreeTen-Backport намеренно использует почти идентичный API. Чтобы перейти от обратного порта к java.time, вам нужно будет сделать немного больше, чем найти и заменить эти операторы import. Главное, что вам придется заменить вручную, — это вызовы служебного класса, используемого для преобразования в/из устаревших классов и современных (java.time*/*ThreeTen-Backport).   -  person Basil Bourque    schedule 01.12.2018


Ответы (1)


Конфликт будет только тогда, когда у вас есть оба импорта:

import org.threeten.bp.LocalDateTime;
import java.time.LocalDateTime;

Наличие только import org.threeten.bp.LocalDateTime; не должно вызывать проблем. Таким образом, вам не нужно полностью квалифицировать какое-либо выражение с помощью LocalDateTime datetime = ....

person Ousmane D.    schedule 30.11.2018
comment
Ах да, да. Только java.lang импортируется автоматически. Спасибо! - person ktm5124; 01.12.2018