2016-02-17 4 views
1

Мне интересно, есть ли способ в java для импорта с относительным путем пакета. Что-то вроде этого:Относительные пути для импорта

import *.fragments.MyFragment; 

Я хотел бы использовать это в тех случаях, которые я имел в Whitelabel приложение, в котором я хотел, чтобы иметь основное приложение имеет одно определение «MyFragment», но вкус продукта необходимо определить его по-разному.

+0

Как это поможет? – dcow

+0

Потому что в противном случае приложение не обращает внимания на изменения вкуса продукта. Если я жестко закодирую путь импорта в основной код приложения, он просто будет продолжать использовать версию этого класса класса, а не код продукта – KairisCharm

+0

Конечно, но как бы '* .fragments.MyFragment' что-нибудь устранить? – dcow

ответ

3

Классы - это полностью квалифицированные предметы. Даже если вы можете импортировать, например. все классы с именем Object из всех пакетов, среда выполнения должна знать, какой из них вы хотите использовать в любом задании. Для среды исполнения не существует никакого способа узнать, какой класс вы хотите без полного имени (это именно то, что предназначены для операторов импорта). И, если два класса имеют одинаковое имя canonical, то они являются одним и тем же классом.

Чтобы быть полным, в vanilla java вы можете фактически загрузить два класса с тем же именем в одну и ту же среду выполнения. Однако вы должны использовать другой загрузчик классов, указанный в разных jars. Вы также можете искусно создавать классные пути таким образом, чтобы вы затеняли другие классы внутри одного и того же загрузчика классов (вы получите класс, который будет первым в пути к классам). Но система сборки Android не даст вам dex нескольких классов с тем же самым каноническим именем. Вы получите DexException, поскольку все, что использовалось, было сжато в тот же файл classes.dex. Я не знаю, появилось ли это ограничение в мире мультидексов.

Чтобы сделать то, что вы хотите, вы можете просто использовать набор источников, специфичных для вкуса. Таким образом, у вас есть src/flavor1/java, которые содержат одно определение класса, а затем src/flavor2/java содержат другое определение того же класса. Если вы сделаете это, класс не может быть определен в основном наборе источников и должен быть определен в каждом источнике каждого источника, установленном независимо.

Обратите внимание, что ароматизаторы обычно определяют типы продуктов и flavor != variant. Таким образом, вы хотите получить normal и whitelabel. В нормальном вкусе вы строите с нормальным фрагментом. В оттенке белого цвета вы строите с другим размахом. Это всего лишь два разных класса.

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

+0

Но это только проблема. Я не хочу менять его для каждого отдельного продукта, только при необходимости. – KairisCharm

+0

@KairisCharm С некоторыми изменениями в build.gradle вы можете добавить набор источников, который разделяется между несколькими вкусами. Это означает, что вы можете иметь две версии вашего фрагмента, каждый из которых находится в своем собственном наборе источников. Затем каждый аромат может объявить, какой источник он использует. –

+0

@ KairisCharm Я подозреваю, что вы не используете ароматы правильно. – dcow

0

В качестве продолжения ответа @ dcow - Вы можете комбинировать ароматы в габаритах. Так что если вы хотите иметь 4 аромата, например, и только два варианта просмотра для них - добавьте еще два аромата, установите их в одном измерении и ваши первоначальные вкусы к другому. И после этого создайте любую комбинацию, в которой вы нуждаетесь.

android { 
    ... 
    flavorDimensions "appversion", "appserver" 

    productFlavors { 
     free { 
      applicationId = "com.myapp.free" 
      dimension "appversion" 
     } 
     paid { 
      applicationId = "com.myapp.paid" 
      dimension "appversion" 
     } 
     server1{ 
      dimension "appserver" 
     } 
     server2{ 
      dimension "appserver" 
     } 
    } 
} 
+0

Я как раз собирался добавить это, но не помню, если вы получаете отдельный источник для каждого измерения. Я не думаю, что вы делаете это, я не был уверен, как это помогает очистить ситуацию. Как указано в комментарии, вы можете просто вручную добавить новый источник, настроенный на вкусы, которые вы хотите, чтобы несколько ароматов использовали один и тот же набор источников, избавляя от необходимости копировать-вставлять одни и те же классы в несколько наборов, специфичных для вкуса. – dcow