【问题标题】:"using" directive in JavaJava中的“使用”指令
【发布时间】:2011-01-25 16:43:18
【问题描述】:

当类型名称太长时,在 C# 中我可以这样创建别名:

using Dict = System.Collections.Generic.Dictionary<string, string>;

我可以这样使用它:

Dict d = new Dict();
d.Add("key", "value");

我可以在 Java 中创建类似的别名吗?

【问题讨论】:

  • 就个人而言,我不会这样做。我认为这使代码更难理解。我经常导入完整的命名空间,因此我不必限定类型,但别名位 IMO 只是通过将类型定义从用法中移开来使代码更难理解。我更喜欢:using System.Collection.Generic; ... var d = new Dictionary&lt;string,string&gt;();

标签: java alias coding-style


【解决方案1】:

简短回答:

但是,您可以(并且应该)import 类,以便不使用其完全限定名:

import java.lang.String
// ....
String s = "hello, world.";

如果您必须定义一个别名,因为您的类使用多级泛型或诸如此类的东西,您可以使用这个技巧 - 通过定义一个扩展您正在使用别名的类(包括泛型)的私有类) 只是为了有一个易于使用的句柄:

class MyMap extends HashMap<String, String> {}

MyMap a = new MyMap();
a.put("key", "val");

(在as an enhancement to Java 之前请求添加类别名,并且仍在等待中)

【讨论】:

  • @Yuval - 这是一个不好的例子。 java.lang 中的所有类都是按需隐式导入的。
  • @Yuval - 我不想创建新类型。弊大于利。
  • @Yuval - 嗯?我>>知道java.lang中的任何类。
  • 使用具体的泛型类型(如您的 MyMap 示例)创建一个新类有助于阐明意图。
  • -1 用于误导性示例和对 RFE 状态的误导
【解决方案2】:

您不能创建别名,但可以import 包 (JLS 7.5 Import Declarations),这样您就不必完全限定该包中的类名。

import java.util.*;
import java.lang.reflect.Field;

....

Set<Field> s = ... // Set is in java.util

您也可以使用static import (guide),不过这​​种做法应该受到限制。

import static java.util.Arrays.asList;

...

System.out.println(asList(1, 2, 3));

【讨论】:

  • 是的,我知道。但有时类型名称(没有命名空间/包)很长。示例:HashMap - 这对我来说太长了...感谢您的回答。
  • 没有别名,抱歉。优点太少,缺点太多。
  • 你实际上可以做 public static class MyHashMap extends HashMap { } 然后在任何你需要的地方做:new MyHashMap()。
  • @Dean:这不是别名,而是定义了一个新类,OP 特别希望避免这种情况。
【解决方案3】:

不,你不能在java中这样做。这里你需要导入包,如果你不想导入包,那么你需要使用完全限定的类名。

【讨论】:

    【解决方案4】:

    我支持 Yuval 的子类把戏。这在性能或语义上没什么大不了的。

    在 C# 中,Dictionary 也是一种 NEW 类型;泛型类型的每个实例化都会在运行时创建一个新类。

    【讨论】:

    • “这没什么大不了的”是一个没有上下文的荒谬说法。而且 C# 不做泛型。 CLR 可以,而且它知道如何折叠代码。所以不,“泛型类型的每个实例化都会在运行时创建一个新类”也是错误的说法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2019-03-25
    • 2014-05-06
    相关资源
    最近更新 更多