来自C和C ++背景,我发现明智地使用typedef
会带来极大的帮助。您是否知道在Java中实现类似功能的方法,无论是Java机制,模式还是您使用的其他有效方法?
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
来自C和C ++背景,我发现明智地使用typedef
会带来极大的帮助。您是否知道在Java中实现类似功能的方法,无论是Java机制,模式还是您使用的其他有效方法?
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
Answers:
Java具有原始类型,对象和数组,仅此而已。没有typedef。
typedef
重新定义boolean
到bool
。
typedef int PlayerID
可使编译器确保PlayerID不与其他int互换使用,并且还使代码对人类更具可读性。基本上,它像一个枚举,但没有一组有限的值。
typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
。
typedef
没有启用任何此类功能。它只是为类型提供了另一个名称。
int
并且需要将其更改为long
,则必须在使用该ID的代码中的每个位置进行更改,这也很有用。如果您有typedef
,则只需在1个地方进行更改。
如果这是您的意思,则可以简单地扩展您要键入的类,例如:
public class MyMap extends HashMap<String, String> {}
typedef
没有文章为那些假类描述的问题(它们是非常真实的)。
final
类一起使用。
从1.6开始,java中没有typedef,您可以根据需要创建包装类,因为您不能将最终类(Integer,Double等)作为子类。
正如其他人之前提到的那样,
Java中没有typedef机制。
我也一般不支持“伪类”,但是这里不应有一般的严格经验法则:
例如,如果您的代码反复使用“基于泛型的类型”,例如:
Map<String, List<Integer>>
您绝对应该考虑为此目的创建一个子类。
可以考虑的另一种方法是,例如,在您的代码中进行如下减速:
//@Alias Map<String, List<Integer>> NameToNumbers;
然后在您的代码NameToNumbers中使用,并执行一个预编译任务(ANT / Gradle / Maven)以处理和生成相关的Java代码。
我知道,对于这个答案的某些读者来说,这听起来可能有些奇怪,但这就是在JDK 5之前有多少个框架实现了“注释”,这就是lombok在做什么以及其他框架。
确实,继承到Javaland的typedef唯一用途是别名-即为同一个类提供多个名称。也就是说,您有一个“ A”类,并且您希望“ B”引用同一件事。在C ++中,您将执行“ typedef BA;”。
不幸的是,他们只是不支持它。但是,如果您控制所有涉及的类型,则可以在库级别进行讨厌的破解-您可以从A扩展B或让B实现A。
typedef
对于为泛型类型的调用创建别名也很有用。例如:(typedef A<Long,String> B;
这可能是您所描述的特例,但更清楚地显示了该想法的吸引力)。
real_t
为double
和bool
为boolean
。
也许这可能是另一种可能的替代方法:
@Data
public class MyMap {
@Delegate //lombok
private HashMap<String, String> value;
}
myMap
类型的实例MyMap
,就只能通过键入myMapInstance.value.SomeOperation()
而不是来对实际的HashMap进行操作myMapInstance.SomeOperation()
。这很烦人,不是吗?
如其他答案所述,您应避免使用伪typedef反模式。但是,即使这不是实现它们的方法,typedef仍然有用。您要区分具有相同Java表示形式的不同抽象类型。您不希望将密码字符串与街道地址字符串或代表偏移量的整数与代表绝对值的字符串混淆。
在检查框架使您在向后兼容的方式来定义一个typedef。我甚至为诸如的原始类int
和诸如的最终类工作String
。它没有运行时开销,并且不会破坏相等性测试。
Checker Framework手册中的“ 部分类型别名”和“ typedef ”描述了根据需要创建Typedef的几种方法。
Kotlin支持类型别名https://kotlinlang.org/docs/reference/type-aliases.html。您可以重命名类型和函数类型。
在某些情况下,绑定注释可能正是您要查找的内容:
https://github.com/google/guice/wiki/BindingAnnotations
或者,如果您不想依赖Guice,只需常规注释即可。
Typedef允许将项目隐式分配给不是它们的类型。有些人试图通过扩展解决这个问题。在IBM的此处阅读以了解为什么这是一个坏主意的解释。
编辑:虽然强类型推断是有用的事情,但我认为(并希望我们不会)看到typedef
托管语言中的丑陋头颅(曾经?)。
编辑2:在C#中,您可以在源文件顶部使用这样的using语句。它已被使用,因此您不必执行显示的第二项。您唯一看到的名称更改是当作用域在两种类型之间引入名称冲突时。重命名仅限于一个文件,使用该文件的每个变量/参数类型都以其全名为人所知。
using Path = System.IO.Path;
using System.IO;
Java中不需要typedef。除了基本元素外,其他所有东西都是对象。没有指针,只有引用。通常使用typedef的方案是在其中创建对象的实例。
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
或IncrediblyFancyGraph
?我总是可以参考该定义以了解其实际含义。这样,我也可以确保不会UnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
因无聊而错过。
Enterprise
。