2

我想定义一个Tag在我正在处理的 Java 包中调用的接口,但由于冲突问题,我不愿使用这样一个听起来很普通的名称。(例如,您只能导入一个具有特定名称的类或接口;如果有多个具有相同名称的类或接口,您可以对其中一个使用 import,但其余的您必须使用整个包名显式引用例如 com.yoyodyne.games.outdoors.Tag)

我也没有更详细的名称(它应该代表一个标签,如 StackOverflow 帖子或其他在线网站中的标签);我能想到的最接近的可能是 TaxonomyTag。

有没有应对这种情况的策略?我能想到的唯一一个是定义一个Collections包含公共接口的静态类(如)Tag,例如,如果我调用它,Taxonomy那么我可以导入Taxonomy并将 Tag 引用为 Taxonomy.Tag ——但这听起来没有多大帮助.

编辑:这种冲突的一个广为人知的例子是ca.odell.glazedlists.matchers.Matcherjava.util.regex.Matcher如果您尝试将正则表达式与 GlazedLists 库一起使用,这会很痛苦。

4

8 回答 8

10

我认为命名类标签没有问题。您的包名称使其具有普遍的唯一性,这是包的目的之一——解决命名冲突。

即使在 Java API 中,也有多个具有相同名称的类:例如 java.util.Date、java.sql.Date。如果您的代码中同时需要这两者,请使用完全限定名称。

于 2009-05-04T17:26:13.020 回答
1

有多少人会使用这个类?如果它是一个通用库,我会使用一个不太通用的名称以避免冲突。如果只有你,而且你现在真的不硬着头皮去使用完全合格的名字。

如果在您发布包之前它成为问题,只需将其重构为一个新名称。

在类似的情况下,我为短类名找到了一些替代名称,因为我讨厌使用 FQN。甚至像 JasonSTag 这样的东西也可以作为临时修复。只是不要那样释放它。通常在实现的中途,我会找到一种更好的方式来描述类,比“标签”更具描述性。

于 2009-05-04T17:28:08.430 回答
1

你是懒惰吗?如果您的类正在使用导入,这样“标签”可能会被阅读您的代码的人误解,即使是暂时的,那么尽管有包命名约定,还是值得考虑一个更好的名称。不要低估命名的力量——或者随着班级的变化而重命名。

于 2009-05-04T20:02:59.057 回答
0

最近使用形容词/副词作为界面名称已经过时了,但是,在您的情况下,如果您使用“Tagable”或“TaxonomyTagable”,听起来不会那么糟糕。

于 2009-05-04T18:10:12.807 回答
0

如果您需要在一个类中使用多个具有相同名称的类,这只会成为一个问题。示例:java.awt.List 和 java.util.List、java.util.Date 和 java.sql.Date。

如果您远离标准 Java 运行时中已经使用的那些,您很可能不会遇到问题。

无论你做什么——让你选择一个好的和描述性的名字——这尤其适用于公共 API 中的那些。你将永远和他们一起生活。

于 2009-05-04T19:04:29.040 回答
0

我真的不会关心这个。

您应该关心的是您的类/接口名称与代码实际执行的匹配程度。如果Tag简洁地描述类/接口的作用和/或要建模的内容,那么我认为这是一个很棒的名字。

我真的看不出你会Tag在同一个类中使用这种类型以及Tag在不同包中声明的其他类型。Tag但是,如果您必须这样做,那么通过它们的完全限定名称来引用其他类型并不是那么痛苦。

我相信你给某物命名的程度比让事情变得方便更重要。

于 2009-05-04T17:26:37.560 回答
0

最好的策略是编写能做好一件事的类。这些类确实需要最少的导入,因此您可以减少导入语句。

我寻找标准的标签接口;在 java.swing..html 中找到了一个,在 servlet API 中找到了另一个,在 Tapestry 库中找到了另一个。我确信你的类不应该直接使用这些(或类似的 API)之一,所以你可能不会害怕命名空间污染。

其他解决方案是在标签前面加上将要使用的对象。例如文章标签。但是您必须仔细选择对象名称。或者,无论如何,您以后总是可以重构它。

于 2009-05-04T17:27:48.960 回答
0

通常,即使名称听起来“普通”,冲突的数量也很少。我在包的上下文中选择了一个有意义的名称。

不要做一些“愚蠢”的事情,比如在公司名称前面加上前缀,例如:YoYoDyneTag。

于 2009-05-04T17:28:37.320 回答