частные подклассы ... это плохо? - PullRequest
2 голосов
/ 02 декабря 2011

Так что я считаю себя младшим разработчиком Java / Android

Я всегда сталкивался с ними, но никогда не любил их и считал их грязным кодом

class herp{
 private class derp extends OnclickListener{
 ...
 }
 private class gerp AsyncTask{
 ...
 }
}

так я должен стараться избегать этого? или даже убедитесь, что я никогда не использую их?

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

То, что является грязным кодом, а что нет, очень субъективно.

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

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

Теперь, сколько у вас будет derp экземпляров?Скорее всего, у вас есть один.Поэтому вместо этого я бы сделал следующее:

OnClickListener derp = new OnClickListener() {
    // fill in methods to override here
}

По сути, это то же самое, но я не могу повторно использовать класс для чего-либо, что хорошо - никто не должен повторять одно-класс стрельбы!

1 голос
/ 02 декабря 2011

То, что является и не является чистым кодом, часто является личным предпочтением, основанным на опыте.Вложенные классы не являются беспорядочными, так что вы должны быть уверены, что это подходящая ситуация.

Если вам отчаянно нужны определенные функции для класса, который расширяет что-то вроде OnClickListener в вашем вопросе, то этовопрос, сколько раз вам нужен этот класс?Если ответ один раз, тогда анонимный класс будет более чистым решением.Если ответ содержится в каждом отдельном методе класса, тогда вложенный класс явно имеет больше смысла.

Более или менее каждая функция в Java имеет время и место, в которых она считается подходящей.Частные вложенные классы, такие как те, которые у вас есть в вашем вопросе, должны быть зарезервированы в моей памяти для случаев, когда вы удовлетворяете двум условиям:

a) вам абсолютно необходим отдельный класс, который будет использоваться только в этом классеи не где еще

И

b) вам нужно будет использовать этот класс в нескольких местах внутри класса.

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

0 голосов
/ 02 декабря 2011

Всё хорошо.Вы можете сделать их static внутренними классами, в противном случае вам понадобится экземпляр herp для его создания (хотя это может быть тем, что вам нужно):

class herp {
    private static class derp extends OnclickListener{
        ...
    }
    private static class gerp AsyncTask{
        ...
    }
}

Показанная разница:

public static void main(String[] args) {
    // With static:
    new derp();
    // Without static:
    new herp().new derp();
}
0 голосов
/ 02 декабря 2011

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

Частные внутренние классы полезны по многим причинам.Вы можете использовать их для предоставления реализации интерфейса (например, реализация List может определять свою собственную реализацию Iterator как частный внутренний класс), не делая конкретный класс видимым.Он защищает реализацию и позволяет вам предоставить достаточно информации пользователю вашего API / класса, чтобы он мог правильно его использовать, не загромождая вашу документацию ненужными деталями (ваш конкретный класс).

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...