“localhost”在Java中是一个常量吗?

3

“localhost”在Java SE 6中是否有常量?虽然打字并不困难,但是在许多地方使用一个常量而不是字符串可能更好。是否有标准做法?

编辑:我知道如何创建一个常量。过去,我发现像org.apache.http.HttpHeaders这样的常量比使用自己的常量更清晰,因为它们不太容易出错或意外修改。


3
我不确定我理解这个问题。您是在问如何创建一个常量吗?您是否为此字符串创建了一个常量,但在某个地方出现了错误? - David
公共静态字符串 LOCAL_HOST = "localhost" 或 公共静态字符串 LOCAL_HOST = "127.0.0.1"。 - Jayamohan
1
Java 没有提供常量。 - jco.owens
3
我完全不明白为什么这个问题被关闭。这是一个很有用的问题——事实上,正是我想问的问题,也是我找到这个问题的原因。在代码中硬编码的东西越少越好——出错的空间也越小。这与https://dev59.com/2GvXa4cB1Zd3GeqPGCXo的情况类似,那也非常有用。几乎总是更好地使用系统常量。 - Garret Wilson
1
它应该被关闭为一个请求离线资源,即Javadoc的L索引。"不具有建设性"本身就不具有建设性。 - user207421
显示剩余3条评论
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即可。

1
问题在于回环IP地址可能没有注册名称。如果使用getLocalHost().getHostName(),它可能为null,如果您不允许它,则可能导致NPE。如果硬编码“localhost”,则可能无法解析。如果将它们中的任何一个放在常量后面,那么您会得到某些“应始终工作”的幻觉... - Stephen C

2
“localhost”在Java SE 6中是否作为常量存在?
简短的答案是“没有”。
您可以通过访问Java SE javadoc索引页面中的“L”并进行搜索来确认。任何首字母大写的公共“localhost”或“local_host”常量都未在javadoc中列出。
虽然打“localhost”不是很困难,但在许多地方拥有一个常量而不是字符串可能更好。 首先,我不同意这会是“好的”。在我看来,它将使代码不太易读。 SomeInterface.LOCAL_HOST比“localhost”多了很多字符。如果您使用了静态导入,则读者仍然需要查找LOCALHOST的定义才能确定它实际上已绑定到什么。其次,更重要的是,“localhost”名称实际上是一种约定而不是标准。旧的Windows系统(例如)没有为“localhost”名称提供默认映射,因此不能保证该名称将解析。 (即使它确实,也不能保证它将解析为环回IP地址)。因此,如果Java SE APIs为“localhost”主机名定义了符号,则理论上会引发可移植性问题。请注意,“localhost”和InetAddress.getLocalHost().getHostName()很可能不相同。前者通常解析为127.0.0.1,后者通常解析为其他系统可以路由数据包的IP地址;即不是127.x.x.x IP地址。这有关系吗?在许多情况下是的!例如,通常会使用127.x.x.x地址,以便明确不希望IP流量离开当前主机;例如,因为它正在未加密的情况下发送。

我同意这会让代码变得不太易读,尤其是因为有一半的开发者会使用 Interface.LOCAL_HOST,而另一半则会像今天一样直接使用字符串“localhost”。 - Philip Tenn
因此,按照这种逻辑,这些评论员似乎会认为任何常量定义都是不可取的。我完全不同意。 - Garret Wilson
2
@GarretWilson - 你误解了我的论点,把它当成了一种辩论策略。如果按照我的论点逻辑推理,我不会得出那个结论。就我所知,我认为“所有常量定义都是不可取的”这个观点是站不住脚的。但这是你的草人论点,而不是我的。 - Stephen C
@StephenC,你反对LOCALHOST常量变量的原因是1)它使用的字符比字面值多,2)除非查找定义类,否则你不知道字面值。 (其他论点针对实际值。)论点1)和2)适用于在单独的类中进行的所有常量变量定义。 你可能会继续与我争论,但归根结底,一些可怜的人(mbarrows)只是想知道是否有一个常量定义,以便他的代码可以保持一致并利用标准库,但他却被打败了。 - Garret Wilson
@GarretWilson - 我真正反对LOCALHOST常量的原因是它不可能给出一个始终正确的值。程序员需要意识到,如果他们将“localhost”硬编码到他们的代码中,直接或通过常量,那么他们的代码将无法在所有计算机上运行。这才是真正的关键。就我而言,关于常量本身是“好”还是“坏”的争论完全是一个红色的干鱼。这是你提出来的,不是我。 - Stephen C
@GarretWilson - 就我而言,这里没有任何“辩论”。您断言我认为某些事情并且在说某些事情。我告诉您我不是这样的。故事结束。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接