Java:代码结构&;基本类型变体的类命名-最佳实践
最近,我写了很多类,除了泛型变量外,还有一些基本变量,例如Java:代码结构&;基本类型变体的类命名-最佳实践,java,class,naming-conventions,primitive-types,Java,Class,Naming Conventions,Primitive Types,最近,我写了很多类,除了泛型变量外,还有一些基本变量,例如Foo,IntFoo,DoubleFoo等等,我过去常常将每个变体放在单独的文件中,但很快我发现,由于大量具有类似名称的类,包内容变得不可读。另一方面,将它们放在单独的包中通常会导致包之间失去内聚性和额外的依赖性 同时,我想到了以下结构: public class Foo { public static class TypeFoo<T> { ... } public static class IntFoo {
Foo
,IntFoo
,DoubleFoo
等等,我过去常常将每个变体放在单独的文件中,但很快我发现,由于大量具有类似名称的类,包内容变得不可读。另一方面,将它们放在单独的包中通常会导致包之间失去内聚性和额外的依赖性
同时,我想到了以下结构:
public class Foo {
public static class TypeFoo<T> { ... }
public static class IntFoo { ... }
public static class DoubleFoo { ... }
...
}
公共类Foo{
公共静态类TypeFoo{…}
公共静态类IntFoo{…}
公共静态类DoubleFoo{…}
...
}
或
公共类Foo{
公共静态类类型{…}
公共静态类Int{…}
公共静态类双{…}
}
我对两件事感兴趣:
在我看来,从长远来看,内部阶级将更痛苦。如果你看看微软给他们的公司命名的方式,他们的困境和你一样。他们选择了大量不同的课程,但作为这些课程的消费者,我发现我更喜欢这样
要回答您的第一个问题,应该没有开销。当java编译内部类时,它会将它们分割成单独的
*.class
文件,因此最终的结果是相同的。在编译过程中,解析器必须仔细筛选大量的<代码> fo.*/c>引用,但是额外的时间是可以忽略的。可能与你所做的完全无关,但是你可以考虑用构造器(或者其他方式)来替换所有这些类。如果这些类实现了一个通用接口,那么您不需要在任何地方公开它们,并且仍然可以将它们保存在一个构建器类中
一个很好的例子是,它可能有无数不同的内部类,但您唯一关心的是从中得到的
Map
或ConcurrentMap
实例。不幸的是,我不能在这里使用此模式,因为创建这些变量(如IntFoo)的唯一原因,DoubleFoo等是为了避免在进行算术计算时分配大量对象。如果在内部对象中搅动了大量原语,并且有一个返回单个(装箱)结果的方法,则仍然可以这样做。另外,如果您创建像IntFoo这样的类,您已经增加了开销,不是吗?无论如何,我很难详细说明,因为我对内部结构了解不够。假设您正在为对象实现一个计数器,并且使用方法t getCount(Object o)
有一个模板类ObjectCounter
。假设您已经计算了一个巨大的int[]数组中每个int的出现次数。现在您想知道-1000000和1000000之间的每个数字在该数组中出现了多少个。使用count
方法的object/generic返回类型,这意味着可以创建许多对象,尽管不需要任何分配(若您有返回原语的方法),也可以这样做。这个例子只是为了说明我的观点,不是一个实际的场景。
public class Foo {
public static class Type<T> { ... }
public static class Int { ... }
public static class Double { ... }
}