3

“localhost”在 Java SE 6 中的任何地方都是常量吗?输入出来并不是很困难,但是在很多地方有一个常量而不是字符串可能会很好。有没有围绕这个的标准做法?

编辑:我知道如何创建一个常量。过去,我发现 org.apache.http.HttpHeaders 等常量比使用我自己的更干净,因为它们不太容易出现拼写错误或意外编辑。

4

2 回答 2

6

好吧,您可以像这样获取本地主机的名称:

InetAddress.getLocalHost().getHostName()

前面的代码片段将返回本地主机的配置名称(不是真正的字符串"localhost")。我相信您最好编写自己的常量:

public static final String LOCAL_HOST = "localhost";

并且(尽管有些人会说这是一种不好的做法,但这是有争议的)您可以在任何需要它的类中静态导入常量,只需替换"package.to"为该类所在的真实包和该类TheClass的实际名称定义常量:

import static package.to.TheClass.LOCAL_HOST;

通过这种方式,在需要的地方使用常量将是一件简单的事情LOCAL_HOST

于 2013-01-19T03:26:05.863 回答
2

“localhost”在 Java SE 6 中的任何地方都是常量吗?

简单的答案是否定的。

您可以通过转到“L”的 Java SE javadoc 索引页面并搜索来确认这一点。在 javadoc 中没有以任何大写形式列出公共“localhost”或 local_host“常量。

输入出来并不是很困难,但是在很多地方有一个常量而不是字符串可能会很好。

首先,我不同意它会“很好”。IMO,它会使代码可读性降低。SomeInterface.LOCAL_HOST字符多于"localhost". 而且,如果您使用静态导入,读者仍然需要查找 的定义LOCALHOST以找出它实际绑定的内容。

其次,更重要的是,“localhost”名称实际上是一种约定,而不是一种标准。旧的 Windows 系统(例如)没有为“localhost”名称提供默认映射,因此无法保证该名称会解析。(即使是这样,也不能保证它会解析为环回 IP 地址。)因此,如果 Java SE API 确实为“localhost”主机名定义了一个符号,它(理论上)会引发可移植性问题。

请注意,"localhost"InetAddress.getLocalHost().getHostName()很可能不一样。前者通常解析为127.0.0.1,后者通常解析为其他系统可以将数据包路由到的 IP 地址;即不是127.x.x.xIP地址。有关系吗?在很多情况下,是的!127.x.x.x例如,当您明确不希望 IP 流量离开当前主机时,通常使用地址;例如,因为它是在未加密的情况下发送的。

于 2013-01-19T04:02:32.370 回答