Java命名空间 - 两个在不同包中具有相同名称的类

时间:2013-12-24 17:37:17

标签: java namespaces packages

我来自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. 是否可以这样编写我的实现代码:

  5. 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());
    

2 个答案:

答案 0 :(得分:5)

不确定为什么这会被投票,这是一个有用的讨论。

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

2)看到它的唯一方法是关注链接。在这种情况下,文档肯定会产生误导。

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

之类的操作

答案 1 :(得分:2)

  1. From the JLS

      

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

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

  2. 唯一的选择是将链接悬停在返回值上。这是一个极差的API设计示例,其中内置了名称冲突,而android.text.format.DateFormat应该被命名为DateFormatFactory。看起来这个类可能原本用于与java.text类相同的目的,并且API兼容性使其停滞不前。有关类似的故事,请参阅java.sql.Date

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

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