8

我创建了一个匿名类,在其中声明了一些变量和方法。我的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;
  }
});
4

11 回答 11

5

我很想将它们设为私有,因为如果您重构代码并将匿名类作为标准类提取出来(例如,Intellij 可以通过单击按钮执行此操作),那么拥有私有字段就是你真的想要。你不必去重新学习你的课程以符合你的标准。

于 2010-01-04T19:27:39.743 回答
3

就我个人而言,无论如何我都会将它们设为私有(并在可能的情况下设为最终状态)——总的来说,这只是一个好习惯。

换句话说:如果你必须在上面加上访问修饰符(比如说,关键字package也被用作访问修饰符)你会选择什么?私有的,大概是 - 毕竟,您实际上并不想授予任何其他类访问权限,是吗?

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

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

于 2010-01-04T19:29:07.560 回答
1

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

于 2010-01-04T19:37:48.040 回答
1

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

一般的经验法则是保持成员数据,例如变量,包括您的 Map 对象私有。

于 2010-01-04T19:26:54.007 回答
1

默认修饰符与private修饰符不同,存在细微差别。但是,在您的情况下,将 convert() 设为默认还是私有更像是一个宗教问题。不过,我认为将其设为私有没有任何优势。

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

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
于 2010-01-04T19:30:25.213 回答
1

这真的没关系,但让你的老师开心可能是个好主意,因为他/她会给你评分。

于 2010-01-04T19:31:22.593 回答
1

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

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

于 2010-01-04T19:31:34.183 回答
1

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

于 2010-01-04T19:32:17.990 回答
1

我认为仅仅为了它而将事物标记为私有并没有多大好处。它不会真正为您带来任何好处,并且阅读代码的人可能会在实际上没有任何选择时赋予选择一些意义。

于 2010-01-04T19:33:14.103 回答
1

你想要这些字段private,所以标记它们private。如果一个成员被标记为public不是private,那么一些可疑的事情正在发生。还要标记不应更改的字段final。保持事物标准化意味着更少的思考,或者至少更少对不相关的思考,以及在修改代码时更少的改变。

从语言的角度来看,唯一真正的区别是,如果你在同一个包中扩展了一个基类,你现在有隐藏字段或覆盖的“包私有”(默认访问)方法。成员也可以通过反射(不带setAccessible)由同一包中的代码访问(这可能具有移动代码安全隐患)。

于 2010-01-04T19:34:02.290 回答
0

默认和受保护的区别。

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

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

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

在三周内,而不是几个月内,您会忘记这些对象的预期可访问性,101% 保证。然后,如果您有一个庞大的项目,并且您有一百个不具体的修饰符,并且您迫切希望更新代码,那么您会因被迫对这 100 个对象/方法运行引用检查而感到沮丧。可能有人拿走了你的罐子,发现其中隐藏的 cookie 并使用它们,然后你更改了代码并破坏了某人的代码。

根据您的意图对修饰符进行编码,除非您是以下一项或多项:

  1. 您不再希望在大型 Java 项目中工作。

  2. 你是一个非常聪明的高功能自闭症患者,对你生活中的每一件事都有索引记忆,并且可以在两周内在咖啡店的笔记本电脑上编写一个功能齐全的点对点文件共享服务。

  3. 您故意将其用作另一种混淆代码的工具。
于 2010-01-04T23:00:04.237 回答