匿名类中的私有变量/方法?

时间:2010-01-04 19:24:37

标签: java access-modifiers anonymous-class

我创建了一个匿名类,我在其中声明了一些变量和方法。我的java老师告诉我要把这些私有化。我没有看到改变修饰符有什么不同,因为无论如何这些变量和方法对于匿名类是私有的,所以我更喜欢根本没有修饰符。谁是对的,什么更有意义?请参阅下面的示例代码,其中我为“map”和“convert”选择了无修饰符,而不是将它们设为私有。

Collections.sort(list, new Comparator<String>(){
  public int compare(String a, String b){
    return convert(a).compareTo(convert(b));
  }
  Map<String, String> map = new HashMap<String, String>();
  String convert(String s) {
    String u = map.get(s);
    if (u == null)
      map.put(s, u = s.toUpperCase());
    return u;
  }
});

11 个答案:

答案 0 :(得分:5)

我很想把它们私有化,因为如果你重构代码并将匿名类作为标准类拉出来(例如,Intellij可以通过点击按钮来实现),拥有私有字段是你真正想要的。您不必去修改您的课程以符合您的标准。

答案 1 :(得分:3)

就我个人而言,无论如何我会把它们变成私人的(最终可能是最终的) - 一般来说,这只是一个好习惯。

换句话说:如果你来放置访问修饰符(如果,例如,关键字package也被用作访问修饰符)你会选择什么?私人,大概 - 毕竟,你实际上并不想授予任何其他课程访问权限,对吗?

现在,我已经确定private是最合乎逻辑的访问修饰符,我会在代码中明确说明。

然后,我很可能不会创建一个带有成员变量的匿名内部类 - 我很想把它变成一个命名的嵌套类。

答案 2 :(得分:1)

你的教授是对的。 将所有类变量设为私有,并通过属性(如果不是匿名)公开它们。

一般的经验法则是将包括Map对象在内的变量等成员数据保密。

答案 3 :(得分:1)

默认修饰符与private修饰符不同,存在细微差别。 但是,在你的情况下,无论是使convert()默认还是私有,这都是一个宗教问题。我认为没有任何优势使其成为私人。

无论如何,您的代码有内存泄漏,因为字符串缓存永远不会被清除:-P 此外,对于更短/更少的代码,请使用比较器String.CASE_INSENSITIVE_ORDER

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

答案 4 :(得分:1)

这无关紧要,但让老师高兴,因为他/她会对你进行评分,这可能是一个好主意。

答案 5 :(得分:1)

我说这是风格问题。您不能在匿名类外部访问成员map,但最好将它们定义为私有,以便与其他类保持一致。

如果这是我的代码,我会说,如果一个类很复杂,需要数据成员,可能值得将它拉到一个单独的类中,在这种情况下,我肯定会将数据成员设为私有。 / p>

答案 6 :(得分:1)

关键是当你说“我没有看到改变修饰符有什么不同,因为这些变量和方法无论如何对于匿名类都是私有的”......你会假设你的课程是如何将被使用。对待每个类都会像它一样传递并以各种方式使用,换句话说,使用适当的修饰符。此外,它使课堂的意图明确。无论如何,Java并不像简洁的语言,所以你也可以说清楚。

答案 7 :(得分:1)

我认为将事物标记为私有只是为了它的地狱并没有太大的好处。它实际上并没有给你带来任何好处,如果没有任何东西,那么阅读代码的人可能会对选择产生一些意义。

答案 8 :(得分:1)

您希望这些字段为private,因此请将其标记为private。如果某个成员未标记为public而非private,则会发生可疑事件。同时标记不应更改final的字段。保持标准化意味着更少的思考,或至少更少考虑不相关的东西,而在修改代码时更少改变。

从语言的角度来看,唯一真正的区别是,如果您在同一个包中扩展了一个基类,那么现在您已经隐藏了字段或覆盖了“package-private”(默认访问)方法。也可以通过反射(没有setAccessible)通过相同包中的代码访问成员(这可能会影响移动代码安全性)。

答案 9 :(得分:1)

我会质疑所有这些复杂性的必要性。看看:String.compareToIgnoreCase()

答案 10 :(得分:0)

默认和受保护之间的区别。

<强>保护: 对象/方法可以被同一个包中的所有类访问,也可以被子/扩展类访问。

默认: 对象/方法可供同一包中的所有类访问。

您对对象/方法和代码修饰符的意图是什么? 六个月后回到代码时不要让自己感到困惑,因为在大型项目中你想知道该对象/方法在其他地方是否被访问过。

在三个星期内,不仅仅是几个月,你会忘记这些物品的预期可达性,101%保证。然后,如果你有一个庞大的项目,并且你有一百个不具体的修饰符,并且你非常想要更新代码,那么你会对那些对这100个对象/方法进行参考检查的强迫感到沮丧。可能是有人带着你的罐子,发现了隐藏的饼干并使用它们,然后你改变了你的代码并打破了别人的代码。

根据您的意图对您的修饰符进行编码,除非您是其中一个或多个:

  1. 你没有进一步的工作欲望 在大型java项目中。

  2. 你是一个     非常聪明的高     有功能的自闭症患者     每个事件的索引记忆     你的生活,可以写一个完整功能的对等文件共享服务     在两周之内的一圈     咖啡店。

  3. 你刻意使用它     作为混淆你的另一个工具     代码。