大家怎么看待 effective Java 接口只用于定义类型 这一个准则。

2020-04-07 20:53:04 +08:00
 bigbigeggs
4221 次点击
所在节点    Java
26 条回复
Honwhy
2020-04-07 21:40:26 +08:00
不知道这条规则是不是要表达这个意思

```java
public interface Intf {
public final static String CONSTANT = "1";

public static class IntfImpl implements Intf {
public final static String CONSTANT = "2";
}
public static final class StaticClazz {
public final static String CONSTANT = "3";
}
public static void main(String[] args) {
System.out.println(Intf.CONSTANT);
System.out.println(IntfImpl.CONSTANT);
System.out.println(StaticClazz.CONSTANT);
}
}

```
sakura1
2020-04-07 21:46:12 +08:00
看到 effective java 就来了,虽然目前主写 scala,mark 一下
majiaxin110
2020-04-07 22:41:25 +08:00
> 基本上项目中常量都是写在接口上面吧

求例子,我目前还真没见过接口有很多常量的
Xbluer
2020-04-07 23:13:08 +08:00
Interface/接口 就是用来定义具有若干个方法的功能集合,描述实现接口的类 class 需要实现的功能。如果接口中包含了常量,那么这些常量就涉及到了实现相关的细节,职责不清。

也有历史遗留项目中会专门建立一些接口,里面仅仅包含常量。个人认为这么用勉强也行。

定义常量量更好的方式是定义 enum,或者 class 中 public stat final xxx.
chanchan
2020-04-07 23:34:30 +08:00
接口装常量?我从不这么做,我也不知道为什么...
collery
2020-04-07 23:38:22 +08:00
@chanchan 哈哈 我之前公司有个同事喜欢 接口里面写常量
charlie21
2020-04-07 23:40:18 +08:00
轻型接口不需要

重型接口随便
SaulLawliet
2020-04-07 23:43:06 +08:00
常量写在接口上比较省事. 有时一两个常量, 懒得专门定义一个工具类.
我觉得实际要看常量的数量把, 少了就写在接口上, 多了就定义一个工具类用来导出常量,
lee015
2020-04-08 01:34:41 +08:00
不会单独写个接口放常量。如果是接口方法参数用到少数几个常量可选取值,会放这个接口里一起写。
SoloCompany
2020-04-08 02:13:21 +08:00
你应该是理解错了
并不是不建议在接口上定义常量
而是接口不应该只用来定义常量

以及比如利用 "实现" 接口来 "继承" 常量是一个 bad pratice
相对而言更正确的做法应该是使用 static import

> The constant interface pattern is a poor use of interfaces.
xcstream
2020-04-08 04:02:52 +08:00
代码量越多看上去越复杂 kpi 就多
wysnylc
2020-04-08 10:10:29 +08:00
时代在发展,接口已经可以写 default 了,让作者更新下书吧
YzSama
2020-04-08 10:12:42 +08:00
其实,如果是 SDK 接口。可以这么直接定义
有些开源项目,定义好某些模块的功能接口 会直接把 请求地址写在 interface 类上 。实现的时候,直接使用定义好的地址。

本来 接口上定义的 变量,就是 常量。
hantsy
2020-04-08 11:56:49 +08:00
@wysnylc 有最新版本,更新到 9,11 了吧。
hantsy
2020-04-08 11:59:46 +08:00
接口定义常量,只能说明你的程序可以执行。合理与否,看这个接口本身的设计目的,是不是为了其实现类中使用。如果纯粹是用接口来定义常量,只能说有毛病。
yidinghe
2020-04-08 12:44:23 +08:00
当 java 发展到 5.0,出现枚举类型后,不论是在接口还是在类中定义常量,都已经不是设计的首选。尤其是通过接口来定义常量。如果用类来定义的话,起码还能将常量类型定义为这个类自身,起到类似枚举的效果;而接口就做不到了。
brucewuio
2020-04-08 14:04:11 +08:00
没有什么教条,看实际情况,吸收具体情况所需要的知识
wozhizui
2020-04-08 15:06:37 +08:00
接口主要定义抽象方法吧,针对接口编程,主要是 implement 后,实现相应的方法。
常量理解成属性,接口针对的是方法,属性一般不应该写在接口中吧,我是这么理解的。
bigbigeggs
2020-04-08 21:24:01 +08:00
@SoloCompany
static import?
那比如项目中大量的常量应该统一写在哪里比较合适呢?
bigbigeggs
2020-04-08 21:25:32 +08:00
@majiaxin110
基本上每个公司的项目中,有统一存放常量的地方吧。
我们的项目基本都在 xxxConstans 接口类中。
不放接口,那应该放在那里?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660226

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX