由于有C和c++的背景,我发现明智地使用typedef是非常有用的。您是否知道在Java中实现类似功能的方法,无论是Java机制、模式,还是您使用过的其他有效方法?
typedef
Java有基本类型,对象和数组,仅此而已。没有定义类型。
在java 1.6中没有类型定义,你能做的是为你想要的做一个包装类,因为你不能子类化最终类(Integer, Double等)
Typedef允许将项隐式分配给它们不是的类型。有些人试图通过扩展来解决这个问题;请阅读IBM关于为什么这是一个坏主意的解释。
编辑:虽然强类型推断是一个有用的东西,但我不认为(并且希望我们不会)看到typedef在托管语言中出现它丑陋的头部(永远不会?)。
编辑2:在c#中,你可以在源文件的顶部使用这样的using语句。这样你就不用做第二项了。只有在作用域引入两个类型之间的名称冲突时才会看到名称更改。重命名仅限于一个文件,除此之外,使用它的每个变量/参数类型都知道其全名。
using Path = System.IO.Path; using System.IO;
在Java中不需要类型定义。除了原语外,所有东西都是Object。没有指针,只有引用。通常使用typedef的场景是创建对象的实例。
您可以使用Enum,尽管它在语义上与typedef略有不同,因为它只允许一组受限制的值。另一个可能的解决方案是命名包装器类,例如。
public class Apple { public Apple(Integer i){this.i=i; } }
但这似乎更笨拙,特别是考虑到从代码中无法清楚地看出类除了作为别名之外没有其他函数。
如果这是你的意思,你可以简单地扩展你想要typedef的类,例如:
public class MyMap extends HashMap<String, String> {}
实际上,typedef传递到Javaland的唯一用途是别名——也就是说,为同一个类提供多个名称。也就是说,你有一个类“a”,你希望“B”指的是同一个东西。在c++中,你会做"typedef B A;"
不幸的是,他们就是不支持它。然而,如果你控制了所有涉及到的类型,你就可以在库级别上做一个讨厌的黑客——你要么从a扩展B,要么让B实现a。
正如其他人之前提到的, Java中没有类型定义机制。< BR > 一般来说,我也不支持“假类”,但这里不应该有一般严格的经验法则: 例如,如果你的代码反复使用“基于泛型的类型”,例如:
Map<String, List<Integer>>
//@Alias Map<String, List<Integer>> NameToNumbers;
也许这是另一种可能的替代:
@Data public class MyMap { @Delegate //lombok private HashMap<String, String> value; }
在某些情况下,绑定注释可能正是你想要的:
https://github.com/google/guice/wiki/BindingAnnotations
或者,如果您不想依赖于Guice,那么使用常规注释就可以了。
正如在其他答案中提到的,你应该避免pseudo-typedef反模式。然而,typedef仍然是有用的,即使这不是实现它们的方法。您希望区分具有相同Java表示的不同抽象类型。你不希望混淆密码字符串和街道地址字符串,或者表示偏移量的整数和表示绝对值的整数。
检查程序框架允许你以向后兼容的方式定义类型定义。I甚至适用于像int这样的基元类和像String这样的final类。它没有运行时开销,也不会破坏相等性测试。
int
String
检查器框架手册中的类型别名和类型defs节描述了几种创建类型defs的方法,具体取决于您的需要。
Kotlin支持类型别名https://kotlinlang.org/docs/reference/type-aliases.html。可以重命名类型和函数类型。