您可以在Java接口中声明常量的目的是什么?

时间:2013-06-01 16:10:36

标签: java oop interface

规范声明该接口旨在定义类可以执行的 what 的合同,并包含实现所需的一组方法。但与此同时,界面可能有常量。

Java的目的是什么?

界面中常量的存在点是什么,它们如何在其中使用?据我所知,他们只能被方法视为参数。但我没有看到太多意义,因为界面没有说明如何类实现其方法。

7 个答案:

答案 0 :(得分:11)

常量也是接口的一部分。在设计中使用常量值来避免 Magic Numbers ,即对实现具有某种意义的数字,但似乎突然冒出来。

在很多情况下,数值会影响代码的行为。例如,考虑GUI按钮的界面。如何实际绘制此按钮取决于实现;但它是什么样的按钮是形成界面的合同的一部分:它是一个普通的按钮,它有一个图像,还是一个复选框?可以使用OR'ing值常用的常量修改此行为:例如,int buttonType = PUSHBUTTON|IMAGEBUTTON

答案 1 :(得分:2)

常量可以在外部界面中使用。

例如,它们可以由实现接口的类使用。如果跨实现类需要单个定义,这可能很有用。

例如,考虑一个接口,它定义了一些可以在所有子类中一致使用的按位OR样式常量。只需要对这些定义进行单一定义,并且只需要学习一组。

答案 2 :(得分:2)

想象一下使用图像或声音等资源的应用程序。您可以为资源定义一个公共接口。

interface MyResource {
    void load();
    void dispose();
    // ...
}

您的文件夹结构可能如下所示:

+ Root
|--+ Resources
   |--+ Images
   |--+ Sounds
   |--+ Data

您知道所有资源都在Root/Resources/下。 这些信息不仅可以由您的资源共享和知晓,还可以由您的其他应用程序组件共享和识别。

考虑到这一点,您的界面现在变为:

interface MyResource {
    public static final String RESOURCE_ROOT_PATH = "Root/Resources/";

    void load();
    void dispose();
    // ...
}

您的特定实现(例如图像)可以根据所有资源的公共路径定义自己的根路径。

class MyImage implements MyResource {
    public static final String IMAGE_ROOT_PATH =
            MyResource.RESOURCE_ROOT_PATH + "Images/";

        ...
}

或者,您可以查看javax.swing.SwingConstants之类的接口,这些接口用于在实现之间共享特定功能的常量。

但是,对于这类事情,我现在更倾向于使用enum

答案 3 :(得分:1)

让我们用一个例子来解释:

public interface People {
    /**
     * Gets the population for the given type
     */
    public Population getPopulationForType(int populationType);
}

您是否觉得上述合同易于理解?或者下面会不会更好?

public interface People {
    int BLACK_POPULATION_TYPE = 0;
    int ASIAN_POPULATION_TYPE = 1;
    int WHITE_POPULATION_TYPE = 2;

    /**
     * Gets the population for the given type
     */
    public Population getPopulationForType(int populationType);
}

你可以有一个法国人,美国人和中国人的实施,但所有人都应该为所有三种类型的人返回人口。

答案 4 :(得分:1)

在Java 5之后对我这种常量的一种用法(它使enum优于bit掩码并且可以在接口上声明)是当常量是方法契约的一部分时

考虑这样的界面:

public interface Element {
    Element NONE = new EmptyElement();

    /**
     *  Looks up an element using this element as a root.
     *  If the lookup fails, returns Element.NONE.
     */
    Element findElements(String searchBy);
}

常量是方法契约的一部分,我认为应该在界面中。这在API编程中很有用,因为您可以为API方法提供默认或特殊的返回值,供所有人使用和检查。

最常见的情况可以防止返回不明确的null值的问题(例如,HashMap#get()方法会为缺失的密钥和null返回null值),但它还有更多的东西,而不仅仅是空值 - 我认为,任何可以返回的特殊值都应该在界面上。

答案 5 :(得分:0)

接口常量的一个可能用途是确保所有实现类中都可以看到常量。当然,您可以将所有这些放在一个类中,并在这些实现类中使用相同的类,但在规范级别定义常量要容易得多。

以这种方式思考;即使常量没有定义“实现”,但如果任何实现需要它们,它们就在那里。

答案 6 :(得分:0)

它们可用于为方法的返回参数/输入参数赋予符号含义。它已经过了很多日子。