创建网址,例如由
URL url = new URL("http", "localhost", "test.txt");
我必须使用常量字符串“http”。还有许多其他代码行。我无法找到任何包含此字符串的常量(或者更好的是所有常见协议的常量集合)。
协议是否存在任何常量?
答案 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");
或者如果没有更多常量并且您想在同一个类中使用它,那么只在同一个类中创建常量。