规范声明该接口旨在定义类可以执行的 what 的合同,并包含实现所需的一组方法。但与此同时,界面可能有常量。
Java的目的是什么?
界面中常量的存在点是什么,它们如何在其中使用?据我所知,他们只能被方法视为参数。但我没有看到太多意义,因为界面没有说明如何类实现其方法。
答案 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)
它们可用于为方法的返回参数/输入参数赋予符号含义。它已经过了很多日子。