【问题标题】:Java Namespace - Two classes with the same name in different packagesJava 命名空间 - 不同包中具有相同名称的两个类
【发布时间】:2014-01-12 22:09:52
【问题描述】:

我来自没有包和命名空间的 Objective-C。

Android 有 android.text.format.DateFormat,它有返回 java.text.DateFormat 实例的静态方法(特别是getLongDateFormat()getMediumDateFormat())。

  1. 这些方法是被称为“静态方法”还是“类方法”或两者都可以互换?

  2. 看看Android documentation,我怎么知道 android.text.format.DateFormat 方法返回 java.text.DateFormat 实例而不是 android.text.format.DateFormat 实例(返回后者的实例是我最初所期望的)?

  3. 如何导入必要的包才能在我的源代码中使用这两个类?

  4. 我的实现代码可以这样写吗:

DateFormat df = DateFormat.getLongDateFormat(this.getActivity());
mLabel.setText(df.format(mEvent.getDate());

我写它的另一种方式是使用完整的包名,但这似乎没有必要:

java.text.DateFormat df = android.text.format.DateFormat.getLongDateFormat(this.getActivity());
mLabel.setText(df.format(mEvent.getDate());

【问题讨论】:

  • 无赖!这个问题收到了我三年来对 StackOverflow 的第一次反对票! Q_Q
  • static 方法将被视为class 方法。大多数人只会称它们为静态方法,但也可以将它们称为 (在这种情况下)“工厂”方法。这意味着,它们是一个静态方法,它创建并返回一个对象供您使用。

标签: java namespaces packages


【解决方案1】:
  1. From the JLS

    声明为static 的方法称为类方法

    我会说我听到“静态方法”比“类方法”更常用,但两者都在使用,并且应该被有能力的 Java 开发人员理解。

  2. 唯一的选择是将链接悬停在返回值上。这是一个非常糟糕的 API 设计示例,内置名称冲突,android.text.format.DateFormat 应该被命名为类似于DateFormatFactory。看起来这个类可能原本打算与java.text 类具有相同的目的,并且 API 兼容性使其卡住了。类似的故事请参见java.sql.Date

  3. 使用import 只是为了方便,允许您在代码中使用简单的类名。使用完全限定的类名始终是合法的,编译器会将导入的类名转换为完全限定的类名。您不能导入多个具有相同名称的类,因为这样就无法区分它们

  4. 我建议从java.text 导入类,原因有两个:您可能会更频繁地使用它,而且它是更“标准”的类。当面临选择使用相同的简单名称限定两个类之一时,请使用开发人员通常认为它所指的简单名称。

【讨论】:

    【解决方案2】:

    不知道为什么这被否决了,这是一个有用的讨论。

    1) 我一直听说它们被称为“静态方法”。

    2) 查看它的唯一方法是点击链接。在这种情况下,文档肯定具有误导性。

    3/4) 在 java 中执行此操作的典型方法是不导入其中一个类,并完全限定其类名。因此,如果您选择导入 java.text.DateFormat 而不是 android 版本,您会执行 DateFormat df = android.text.format .DateFormat.getLongDateFormat(this.getActivity()); 之类的操作

    【讨论】:

    • 我注意到你选择了 android 类作为完全符合条件的类,这是惯例还是个人偏好?
    • 如果是我自己,我会选择能减少打字的那一个。 (如果你只有一个对 Java DateFormat 的引用,而对 Android 有很多引用,我会完全限定使用较少的一个;Java 的 DateFormat)
    • 个人喜好。我的想法是DateFormat,作为java.* 命名空间中的一个类,如果有人看到一个裸露的DateFormat 类名,则更有可能被假定。
    • @1.静态方法和类方法可以互换使用。见docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
    猜你喜欢
    • 2011-05-29
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2013-04-17
    • 2011-04-10
    相关资源
    最近更新 更多