interface IdFinder {
Serializable UNSAVED = new Serializable() {};
/**@returns the given entity's persistent identity,
or {@link UNSAVED} if it hasn't been saved yet,
or null if o is a value object that hasn't a
persistent identity of its own.
*/
Serializable getId(Object o);
}
4条答案
按热度按时间ebdffaop1#
接口中的所有字段都是
public static final
,即它们是常量。通常建议避免使用此类接口,但有时可以找到一个没有方法且仅用于包含常量值列表的接口。
ct2axkht2#
如果接口引用常量呢?在接口中声明它们不是很自然吗?
oug3syen3#
是的,在接口中可以有常量字段,但如果您说“这似乎与接口应该做的相反”,则是对的,因为这不是一个好的实践。为什么要让所有类实现具有相同常量的接口?您可以简单地将它们放在使用它们的类中,或者如果确实需要以某种方式导出它们,则将它们放在单独的类实用程序中,如下所示:
如果需要表示一组具有某种意义的常量字段,那么还可以使用枚举。我没有看到任何“用例”在接口中实际需要常量。但可能是错的:)
kpbwa7wx4#
首先,oop范例和java中的oop实现之间有区别,所以相同的词可能意味着一些不同的东西。
在oop中,范例接口是您可以对对象做什么(或者对象可以为您做什么)。任何对象都可以有多个接口,从而扮演不同的角色。例如,有人可能是一名程序员,能够创建程序,但同时他可能是一个丈夫和父亲,因此能够支付家庭账单和照顾孩子。在这里,“程序员”、“丈夫”和“父亲”是接口,而人是实现它们的对象。请注意,接口并不意味着存在用于实现对象的任何特定特性(字段),只是该对象应该能够执行的操作。
java或多或少地遵循了这个思想,但是作为任何范例,实现都有自己的特性。java允许描述方法,也就是实现对象应该能够执行的操作,但不允许描述任何实现细节,因此,不允许描述对象字段或私有方法。
但是常数呢(
public final static
字段)?它们是实现或接口的一部分。两者都有可能。e、 接口“程序员”可以有常数WORK_HOURS
设置为“8”。因此,java也允许您描述接口中的常量。请注意,java只帮助您进行良好的oop设计,但并不强烈要求这样做。特别是,不是所有对象的公共方法都应该存在于接口中。例如,getter和setter方法通常是公共的,但实际上它们是实现的一部分,而不是接口,因此不将它们引入接口是值得的。
(还请注意,我在这里描述的大多数东西都是关于主流oop的,比如java,但是也有其他类型的oop,比如基于原型的oop,特别是用javascript实现的oop)。