到哪里去';http';Java中的字符串文字?

到哪里去';http';Java中的字符串文字?,java,Java,创建URL,例如通过 URL url = new URL("http", "localhost", "test.txt"); 我必须使用常量字符串“http”。在许多其他代码行中也是如此。我找不到任何包含这个字符串的常量(或者更好的是找到所有通用协议的常量集合) 是否存在协议的任何现有常量?创建一个类常量 类常量{ 公共静态最终字符串HTTP=“HTTP”; //其他这样的常数。。。 } 和使用一样 URL URL=newurl(Constants.HTTP,“localhost”,“tes

创建URL,例如通过

URL url = new URL("http", "localhost", "test.txt");
我必须使用常量字符串“http”。在许多其他代码行中也是如此。我找不到任何包含这个字符串的常量(或者更好的是找到所有通用协议的常量集合)


是否存在协议的任何现有常量?

创建一个类常量

类常量{
公共静态最终字符串HTTP=“HTTP”;
//其他这样的常数。。。
}
和使用一样

URL URL=newurl(Constants.HTTP,“localhost”,“test.txt”);
或者,如果没有更多的常量,并且您希望在同一个类中使用它,则只在同一个类中使用该常量。

如果字符串“http”必须始终代表值为“http”的
java.string
,则间接地(通过常量)使用该字符串绝对没有理由。这与引入整数常量相同,如下所示:

static final int ONE = 1;
但是,在以下情况下,这是合理的:

  • 变量的名称并不表示基础值是“http”:
    
    //当前值为“http”,但可以更改为“ftp”、“spdy”
    //或者将来会发明更好的协议。
    静态最终字符串协议=“http”;
    

  • 如果预计其类型可能需要更改:
    
    //此常量的类型可能更改为org.qwerty.Protocol
    //(但它将始终指定HTTP协议)
    静态最终字符串HTTP=“HTTP”;
    

  • 字符串明显长于引入的常量:
    
    静态最终字符串HTTP=“超文本传输协议”;
    

  • 该值很难记住或理解:
    
    静态最终整数X_16KiB=16384;//虽然可以使用16*1024
    静态最终字符串OMEGA=“\u2126”;
    
简短回答: 在撰写本文时,JavaSEJDK中没有最终的字符串文本http常量。 更长的答案 我意识到这是一个老问题,但我不认为它一定得到了充分的回答。我相信莱昂的回答部分是正确的。在许多情况下,拥有一个名为HTTP且字符串值为“HTTP”的常量是毫无意义的。然而,在某些情况下,这并非毫无意义。此外,这个问题说明了对协议是什么和不是什么的普遍误解

常数、协议、方案 在Java中使用最终字符串文本有三个主要原因

  • 如果要在多个位置使用相同的值,并且希望在将来需要时在单个位置更改该值
  • 避免使用幻数或其字符串对应项
第一点是不言而喻的,但在这种情况下不太可能。第二点适用于常量“http”,但它取决于用法,下面我将简要介绍与本例相关的用法

HTTP是用于传输超媒体的应用程序协议。它是定义数据如何通过万维网传输的众多协议之一(这个术语经常与“互联网”混淆)。HTTP应用程序协议最容易识别的方面是URI前面的
HTTP:
然而,您看到的http:不是协议,而是方案。方案是协议的一部分,但不是协议。在这种情况下,它可能倾向于使用以下字符串文字常量

final String SCHEME = "http";
此外,如果您正在编写某种类型的服务客户端,它可以在多个协议上工作,那么您可能需要指定一个默认的服务客户端。在这种情况下,以下最后一个字符串文字将是合适的

final String DEFAULT_SCHEME = "http";
有人存在吗? 事实上,Apache确实有一个用于上述原因的http常量,这一事实支持下面的文本

org.apache.http.HttpHost.DEFAULT_SCHEME_NAME
这个常量也包含在旧的httpclient库中,当时它是apachecommons的一部分(现在是HttpComponent的一部分)

推荐 从Java9开始,http不存在JavaSE常量。我倾向于创建自己的常量,而不是使用Apache的。我建议这样做是因为Apache的默认\u SCHEME\u NAME常量专门指的是HttpHost类。将其用于其他用途违反了软件工程的单一目的原则。为了更加实用,HttpHost类可以在不更改默认方案的情况下更改其默认方案(可能)。这显然是一个问题。但是,JavaEE确实为所有HTTP方法、响应状态、头字段和无数其他与HTTP相关的内容(如身份验证类型等)提供了最终字符串文本。我同意您希望在Javas标准库中将这些字符串文本作为常量提供。这只会让我感觉更完整

后记 我想指出用户@gorootde在下面的评论中对最终字符串文本的另一种用法

榜样

最终字符串Z=“Z”


如果在整个代码库中多次使用此结果,则此结果可能仍然有价值,而其他具有不同重要性的
“Z”
。在不知道上下文的情况下,我无法判断,但这将是一个奇怪的选择,需要大量的理由,但从定义上讲,这并不是毫无意义的。

Apache库中有一个常量字段http:

org.apache.http.HttpHost.DEFAULT_SCHEME_NAME

如果您在应用程序中使用此库,您可以在您的案例中使用它。

您可以在项目中创建一个Constants类并在其中定义常量。有关请求方法的相关问题:+1,我还想知道是否有用于此的通用帮助器类(例如Spring的
MediaType
HttpStatus
)我的问题是,是否存在任何现有常量-我知道我可以很容易地