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

Java 匿名类中的私有变量/方法?,java,access-modifiers,anonymous-class,Java,Access Modifiers,Anonymous Class,我创建了一个匿名类,在其中声明了一些变量和方法。我的java老师告诉我把这些设置为私有。我看不出修改器有什么不同,因为这些变量和方法对匿名类来说是私有的,所以我更喜欢没有修改器。谁是对的,什么更有意义?请参阅下面的示例代码,其中我没有为“map”和“convert”选择修饰符,而是将它们设置为私有 Collections.sort(list, new Comparator<String>(){ public int compare(String a, String b){

我创建了一个匿名类,在其中声明了一些变量和方法。我的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;
  }
});
Collections.sort(列表,新比较器(){
公共整数比较(字符串a、字符串b){
返回convert(a).比较(convert(b));
}
Map Map=newhashmap();
字符串转换(字符串s){
字符串u=map.get(s);
如果(u==null)
put(s,u=s.toUpperCase());
返回u;
}
});
你的教授是对的。 将所有类变量设为私有,并通过属性公开它们(如果不是匿名的话)


一般的经验法则是将成员数据(如变量,包括映射对象)保持私有。

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

就我个人而言,我会让它们成为私人的(如果可能的话是最终的),这只是一个好习惯

换一种说法:如果必须启用访问修饰符(例如,如果关键字
package
也被用作访问修饰符),您会选择什么?可能是私有的——毕竟,您实际上不想授予任何其他类访问权,是吗

现在,在确定private是逻辑上最合适的访问修饰符之后,我将在代码中明确这一点


再说一遍,我很可能不会创建一个带有成员变量的匿名内部类——我会尝试将其转换为一个命名的嵌套类。

默认修饰符与
私有修饰符不同,存在细微的差异。
然而,在您的例子中,将convert()设为默认值还是私有值更像是一个宗教问题。不过,我不认为把它保密有什么好处

无论如何,您的代码存在内存泄漏,因为字符串缓存从未被清除:-p 此外,对于更短/更少的代码,请使用比较器
字符串。不区分大小写\u顺序

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

这真的不重要,但让你的老师高兴可能是个好主意,因为他/她会给你评分。

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


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

关键是“我不认为更改修饰符有什么区别,因为这些变量和方法对匿名类来说是私有的"... 你对你的课程将如何使用做了很多假设。对待每一个类,就像它将被传递并以各种方式使用一样,换句话说,根据需要使用修饰符。此外,它还明确了课堂教学的目的。无论如何,Java并不是一种简练的语言,所以你最好清楚一点。

我看不出仅仅为了它而将东西标记为私有有什么好处。它不会真正为您带来任何好处,而阅读代码的人可能会在没有任何选择的情况下对该选择给予一些重视。

您希望这些字段是
私有的
,因此将它们标记为
私有的
。如果一个成员既没有标记为
公共的
也没有标记为
私有的
,那么就有可疑的事情发生了。同时标记不应更改的字段
final
。保持事物的标准化意味着更少的思考,或者至少更少地思考不相关的问题,并且在修改代码时更少地进行更改


从语言的角度来看,唯一真正的区别是,如果在同一个包中扩展了基类,那么现在就隐藏了字段或重写了“包私有”(默认访问)方法。成员也可以通过反射(无需设置可访问性)通过同一包中的代码访问(这可能会影响移动代码的安全性)。

我怀疑是否需要所有这些复杂性。看看:
String.compareTignoreCase()

默认和受保护之间的差异

受保护的: 对象/方法可供同一包中的所有类访问,也可供子/扩展类访问

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

您的对象/方法和相应的代码修改器的意图是什么。 在六个月后回到代码中时,不要让自己感到困惑,因为在大型项目中,您希望知道该对象/方法是否可以在其他任何地方访问

在三周内,而不是几个月内,您将忘记这些对象的预期可访问性,101%保证。然后,如果你有一个巨大的项目,你有一百个不具体的修改器,你拼命想更新代码,你会被强迫对这100个对象/方法运行引用检查所挫败。可能是有人拿走了你的罐子,发现里面隐藏的cookies并使用了它们,然后你更改了你的代码并破坏了别人的代码

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

  • 你不再有工作的欲望了 在大型java项目中

  • 你是一个 高智商 功能性自闭症患者 每一个数据库的索引内存