2015-11-04 1 views
0

Я разрабатываю приложение для Android, и, естественно, у меня есть много классов, на которых представлены виды на экране. Теперь у меня есть этот простой метод DpToPx (INT) здесь, что я видел в другом месте на StackOverflow:Многие классы, которые имеют один и тот же метод или один класс, который имеет метод и наследуется другими классами?

private int dpToPx(int dp){ 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics); 
} 

Я использую это, чтобы обеспечить какую-то последовательность расположения на различных устройствах разрешение экрана. Что лучше -

Чтобы использовать этот метод в каждом классе, который отображает представления или делает его интерфейсом, который реализуются всеми классами?

Специально в плане памяти и удержания объекта (AFAIK иногда лучше повторять один и тот же метод по классам, чем отдельный объект). Но когда это более двух классов?

+1

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

+0

.... в дополнение к комментарию MiKE: конечно, вы должны передать контекст с помощью аргумента метода – Selvin

+0

@MiKE Я попробовал это, но getResources() - это нестатический метод, к которому нельзя получить доступ из статического контекста – zelle

ответ

0

я бы, вероятно, сделать это либо:

  1. Статический метод полезности в полезности класса, что ваши взгляды проходят context в или

  2. Метод экземпляра класса полезности Ваше отношение создания экземпляра

Например

class LayoutUtils { 
    public static int dpToPx(Context context, int dp){ 
     DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); 
     return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics); 
    } 
} 

или

class LayoutUtils { 
    private Context context; 

    LayoutUtils(context context) { 
     this.context = context; 
    } 

    public int dpToPx(int dp){ 
     DisplayMetrics displayMetrics = this.context.getResources().getDisplayMetrics(); 
     return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, displayMetrics); 
    } 
} 

В последнем случае каждый вид будет иметь LayoutUtils экземпляр.

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

+1

Я думаю, что первый вариант - лучшее решение - таким образом я избегаю создания новых объектов и сохранения ссылки на объект Контекста, который из того, что я прочитал, является основной причиной утечки памяти. Благодаря! – zelle

0

Я создаю класс «Utils» внутри пакета «помощники», и там я помещаю все методы и переменные, которые, как я думаю, будут использовать во всем приложении.

Тогда его просто назвать как Utils.dpToPx (10); Не забудьте импортировать класс :)

Это мой способ сделать это Я не знаю, если он лучший.

Немного кода

общественного класса Utils {

public static int dp2px(int dp, Context context) { 
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, 
      context.getResources().getDisplayMetrics()); 
} 

}

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+0

У меня нет достаточной репутации, но жаль –

+0

Я добавляю код –