在Java中获取'http'字符串文字的位置?

时间:2016-06-16 06:00:26

标签: java

创建网址,例如由

URL url = new URL("http", "localhost", "test.txt");

我必须使用常量字符串“http”。还有许多其他代码行。我无法找到任何包含此字符串的常量(或者更好的是所有常见协议的常量集合)。

协议是否存在任何常量?

4 个答案:

答案 0 :(得分:4)

前言

我意识到这是一个古老的问题,但我不认为它必须得到充分的回答。我相信莱昂的回答是部分正确的。有一个名为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库中,当它是Apache Commons的一部分时(它现在是HttpComponent的一部分)。

建议

从Java 9开始,http不存在Java SE常量。我倾向于创建自己的常量而不是使用Apache。我建议这是因为Apache的DEFAULT_SCHEME_NAME常量特指HttpHost类。将其用于其他方面违反了软件工程的单一目的原则。为了更实用,HttpHost类可以在不更改默认方案的情况下更改其默认方案(可能)。这显然是一个问题。但是,Java EE确实为您提供了所有HTTP方法,响应状态,标头字段以及许多其他与HTTP相关的事物(如身份验证类型等)的最终字符串文字。我希望提供这些字符串文字作为Javas标准库中的常量。这会让我感觉更加完整。

答案 1 :(得分:2)

使用字符串" http"间接(通过常数)绝对没有理由,如果它必须始终代表具有值" http"的java.String。它与引入整数常量ONE的方法相同如下:

static final int ONE = 1;

但是,在以下情况下可以证明其合理性:

  • 变量的名称并不表示基础值是" http":
    // The current value is "http", but may be changed to "ftp", "spdy" // or whatever better protocols will be invented in the future. static final String PROTOCOL = "http";

  • 如果预计其类型可能需要更改:
    // The type of this constant is likely to be changed to org.qwerty.Protocol // (but it will always designate the HTTP protocol) static final String HTTP = "http";

  • 该字符串明显长于引入的常量:
    static final String HTTP = "Hypertext Transfer Protocol";
  • 价值难以记住或理解:
    static final int X_16KiB = 16384; // though 16*1024 could be used instead static final String OMEGA = "\u2126";

答案 2 :(得分:1)

org.apache.http.HttpHost.DEFAULT_SCHEME_NAME中存在此常量字段“http”

你可以在你的情况下使用它。

答案 3 :(得分:0)

创建一个类Contants:

class Contants{
 public static final String HTTP = "http";
 // Other such constants...
}

并使用如下:

URL url = new URL(Constants.HTTP, "localhost", "test.txt");

或者如果没有更多常量并且您想在同一个类中使用它,那么只在同一个类中创建常量。