私有子类。。。这是件坏事吗? 所以我认为自己是一个初级java/Android开发者

私有子类。。。这是件坏事吗? 所以我认为自己是一个初级java/Android开发者,java,coding-style,Java,Coding Style,我经常遇到这些问题,但从未真正喜欢过它们,并将它们视为肮脏的代码 class herp{ private class derp extends OnclickListener{ ... } private class gerp AsyncTask{ ... } } 那么我应该避免这些吗?或者甚至确保我从未使用过这些?什么是脏代码、什么不是脏代码是非常主观的 可以说,嵌套类非常有用。通常情况下,它们不需要这样嵌套,因为它们很可能是匿名类 这个想法是:您需要尽可能少的其他类来访问您的小

我经常遇到这些问题,但从未真正喜欢过它们,并将它们视为肮脏的代码

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

那么我应该避免这些吗?或者甚至确保我从未使用过这些?

什么是脏代码、什么不是脏代码是非常主观的

可以说,嵌套类非常有用。通常情况下,它们不需要这样嵌套,因为它们很可能是匿名类

这个想法是:您需要尽可能少的其他类来访问您的小类。你不会想做你自己的包裹,因为你真的属于你已经在其中的包裹。相反,您创建了一个私有类。现在只有你可以使用它,这很好,因为它是为你的班级量身定做的

现在,您将拥有多少个
derp
实例?你很可能会有一个。因此,我不会这样做,而是这样做:

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

它基本上做了相同的事情,但我不能为任何事情重用该类,这是好的-没有人应该重用一次性类

这个问题没有固定的答案。这主要取决于您自己的编码风格、首选项和团队的编码约定

私有内部类之所以有用有很多原因。您可以使用它们来提供接口的实现(例如,
列表
实现可以将自己的
迭代器
实现定义为私有内部类),而不使具体类可见。它保护实现,并允许您向API/类的用户提供足够的详细信息,以便用户能够正确使用它,而不会用无用的详细信息(您的具体类)扰乱您的文档

您还可以使用私有内部类作为侦听器的实现,尽管有些人可能不同意这种理念。当侦听器有一些复杂的逻辑时,我确实更喜欢使用私有内部类而不是匿名类

您可能还希望使用它们将代码逻辑分离到单独的类中,但不希望在外部类之外公开这些类


请记住,使用私有内部类的每个解决方案也可以在不使用它们的情况下实现。和生活中的许多事情一样,使用私有的内部类本身并不是一个坏习惯,但是滥用是一个坏习惯。

没关系。您可以考虑将它们定义为代码> static 内部类,否则您将需要一个<代码> Help < /Cord>的实例来创建一个(虽然这可能是您想要的):

不同之处在于:

public static void main(String[] args) {
    // With static:
    new derp();
    // Without static:
    new herp().new derp();
}

什么是和什么不是干净的代码通常是基于经验的个人偏好的倍。嵌套类并不是一塌糊涂,但是您应该确定这是一种适当的情况

如果您迫切需要一个类的某些特定功能,该类在您的问题中扩展了类似OnClickListener的内容,那么问题是您需要这个类多少次?如果答案是一次,那么匿名类将是一个更干净的解决方案。如果答案在类中的每个方法中,那么嵌套类显然更有意义

Java中的每个特性或多或少都有一个被认为合适的时间和地点。对于满足以下两个条件的情况,我认为应该保留私有嵌套类(如您在问题中所使用的类):

a) 您必须有一个单独的类,它只在这个类中使用,而不在其他地方使用

b) 您将需要在类中的多个位置使用该类


归根结底,嵌套的私有类本身并不脏,也不难维护,但与编程语言的任何其他特性一样,请确保您需要它们

做新的herp(),新的derp();违反OO封装。这样做是一个明确的信号,表明derp()需要是一个外部世界中可见的类。长匿名类的可读性可能不如命名的内部类。
public static void main(String[] args) {
    // With static:
    new derp();
    // Without static:
    new herp().new derp();
}