首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何编写高质量的代码

错误;使用valueOf前必须进行校验;枚举项的数量控制在64个以内;小心注解继承;枚举和注解结合使用威力更大;注意@Override不同版本的区别;泛型和反射强制声明泛型的实际类型;不同的场景使用不同的泛型通配符...静态内部类与普通内部类的区别:1、静态内部类不持有外部类的引用,在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。...泛型和反射 强制声明泛型的实际类型; (无法从代码中推断出泛型类型的情况下,即可强制声明泛型类型;方法:Listlist2 = ArrayUtils.asList();在输入前定义这是一个Integer...1、泛型结构只参与“读”操作则限定上界(extends关键字);2、泛型结构只参与“写”操作则限定下界(使用super关键字);3、如果一个泛型结构既用作“读”操作也用作“写”操作则使用确定的泛型类型即可...,如List 严格限定泛型类型采用多重界限; (使用“&”符号连接多个泛型界限,如:)。

1K20

Effective Java(第三版)-学习笔记

没有泛型前,操作集合中的元素必须进行强转,而类型转换异常只能在运行期才能发现。泛型可以告诉编译器集合中每个元素是什么类型的,从而可以在编译期就发现了类型转换的错误。泛型使得程序更加安全,简洁明了。...关于泛型类型的获取,可参考: java Type 详解 Java泛型的学习和使用 消除每一个未检查的警告 每一个未检查的waring都是一个潜在的运行时类型转换异常,尽量保证代码不提示这种异常...优先使用集合而不是数组 因为数组不支持创建泛型数组(如new List[],new E[]),它只能保证运行时的类型安全而不是编译时的类型安全。...isEmpty()){ dst.add(pop()); } } 慎重可变参数的泛型类型参数 因为可变参数是由数组实现的,当数组和泛型共同使用时,可能导致类型转换的失败...2.如果每个枚举对象都有各自特有的行为,最好是定义一个抽象方法,让枚举对象各自实现这个抽象方法。

1.2K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java—面向对象高级(第十二天)

    枚举是一种特殊的类,它的格式是:public enum 枚举类名{ 枚举项1,枚举项2,枚举项3;}其实枚举项就表示枚举类的对象,只是这些对象在定义枚举类时就预先写好了,以后就只能用这几个固定的对象...//定义一个泛型类,用来表示一个容器//容器中存储的数据,它的类型用先代替用着,等调用者来确认的具体类型。...泛型限定的意思是对泛型的数据类型进行范围的限制。有如下的三种格式 表示任意类型类型> 表示指定类型或者指定类型的子类泛型只能编译阶段有效,一旦编译成字节码,字节码中是不包含泛型的。而且泛型只支持引用数据类型,不支持基本数据类型。...Java中8种基本数据类型都用一个包装类与之对一个,如下图所示我们学习包装类,主要学习两点:创建包装类的对象方式、自动装箱和拆箱的特性;利用包装类提供的方法对字符串和基本类型数据进行相互转换4.2.1

    7910

    Effective Java笔记(不含反序列化、并发、注解和枚举)

    5.消除过期的对象引用: 1.一些对象在没有用了之后,还被有用的对象持有引用,此时就产生了内存泄漏 2.为了解决1,需要在最紧凑的作用域中定义每一个类型,而不是自己每次都手动去清理不需要的对象。...6.另一个实现对象拷贝的办法就是提供一个对象拷贝构造器或者拷贝工厂。...: 1.常量接口模式是不良的模式 2.导出常量可以在具体类之中 7.用函数对象表示策略:策略模式 4.泛型 1.不要在新代码中使用原生态类型: 1.每个泛型都定义了一 个原生态类型 ,即不带任何实际泛型参数的泛型...3.泛型的好处就是编译器帮你自动处理类型转换,而且如果出现狗插入猫的列表的时候,会在编译的时候就进行提示 4.List和List的区别在于:前者没有泛型检测,后者在检测的时候表明任何对象都能放入其中...extends Object>禁止插入任何对象。而获取其中的对象都是Object类型。 4.有了2,那么我们如何让List向下转型呢?这时候要引入List<?

    957110

    Java5新特性及使用

    在Java5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的任意化,任意化带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。...也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。 要想在表达式中使用类型,需要显式地传递类型的class对象。...泛型的类型参数可以有多个。 所有泛型类的类型参数在编译时都会被擦除。 创建泛型对象时请指明类型,让编译器尽早的做参数检查。 不能创建泛型数组。如果想要创建泛型数组,建议使用ArrayList。...使用带泛型的类创建对象时,等式两边指定的泛型必须一致。 泛型的好处: 类型安全。 消除强制类型转换。 提高性能。...以后,就可以使用缓存中包含的实例对象,而不是创建一个新的实例(在自动装箱的情况下)。 这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。

    1.3K30

    .Net中的反射(序章) - Part.1

    反射是一个庞大的话题,牵扯到的知识点也很多,包括程序集、自定义特性、泛型等,想要完全掌握它非常不易。本文仅仅对反射做一个概要介绍,关于它更精深的内容,需要在实践中逐渐掌握。...我在后面将较详细地介绍 Type类,现在只希望你能对反射有个第一印象,所以只简略地作以说明:Type抽象类提供了访问类型元数据的能力,当你实例化了一个Type对象后,你可以通过它的属性和方法,获取类型的元数据信息...注意到这里,因为Type对象总是基于某一类型的,并且它是一个抽象类,所以我们在创建Type类型时,必须要提供 类型,或者类型的实例,或者类型的字符串值(Part.2会说明)。...); //将BookingStatus改作TicketStatus 既然这样,我们何不定义一个泛型类来进行代码重用呢?...Runtime)对于 类型和对象(及其成员)的基本信息 以及 元数据(metadata)的访问能力。

    1.2K40

    思维导图学《Java 编程思想》

    这种额外的复杂性非常显著,如果你让某人去处理这种复杂性,只是因为你意识到由于以防万一而添加了新接口,而没有其他更有说服力的原因,那么就该质疑此人所作的所有设计了。...第1章 对象导论 [第1章 对象导论] 第2章 一切都是对象 [第2章 一切都是对象] 第4章 控制执行流程 [第4章 控制执行流程] 第5章 初始化和清理 [第5章 初始化和清理] 第6章 访问控制权限...[第6章 访问控制权限] 第7章 复用类 [第7章 复用类] 第8章 多态 [第8章 多态] 第9章 接口 [第9章 接口] 第10章 内部类 [第10章 内部类] 第11章 持有对象 [第11章 持有对象...] 第12章 异常 [第12章 异常] 第13章 字符串 [第13章 字符串] 第14章 类型信息 [第14章 类型信息] 第15章 泛型 [第15章 泛型] 第16章 数组 [第16章 数组] 第17...[第19章 枚举类型] 第20章 注解 [第20章 注解] 第21章 并发 [第21章 并发] [第21章 并发] [第21章 并发] 公众号 coding 笔记、点滴记录,以后的文章也会同步到公众号

    44510

    TypeScript 在实际项目中的应用#2024年度实用技巧

    Generics 用于创建可重用、灵活且类型安全的组件的机制 泛型让我们在定义函数、接口或类的时候, 不预先指定具体的类型, 而在使用的时候再指定类型,这使得代码更具可复用性和灵活性。...需要注意的是,泛型中的T(Type)只是一个常见的命名习惯,你也可以使用其他命名方式。...,这时可以使用泛型约束,指定泛型参数必须满足的条件。...使用了 Array 泛型类型的语法,Array 是一个泛型类 let arr2: Array = [1, 2, 3]; 类型别名 Type MyString 是一个字符串类型的别名。...type MyString = string; Container 是一个泛型类型别名,它接受一个类型参数 T,通过使用 NumberContainer 别名,我们创建了一个特定类型为 number 的容器

    7521

    编写高质量可维护的代码:Awesome TypeScript

    const str: string = 'abc'; 接口 在面向对象编程的语言里面,接口是实现程序解耦的关键,它只定义具体包含哪些属性和方法,而不涉及任何具体的实现细节。...#name; // 访问会报错 泛型 应用场景:当我们需要考虑代码的可复用性时,就需要用到泛型。让组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型。...泛型允许同一个函数接受不同类型参数,相比于使用 Any 类型,使用泛型来创建的组件可复用和易扩展性要更好,因为泛型会保留参数类型。泛型可以应用于接口、类、变量。...使用大写字母 A-Z 定义的类型变量都属于泛型,常见泛型变量如下: T(Type):表示一个 TypeScript 类型 K(Key):表示对象中的键类型 V(Value):表示对象中的值类型 E(Element...:和 typeof 类型用法相似,它主要是用来判断是否是一个类的对象或者继承对象的。

    2.4K10

    C#泛型方法解析

    使用一个泛型类型并指定类型实参时,实际是在CLR中定义一个新类型对象,新类型对象是从泛型派生自的那个类型派生的。...具体看一下泛型接口IEnumerable:公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。...C#编译器支持在调用一个泛型方法时进行类型推断。执行类型推断时,C#使用变量的数据类型,而不是由变量引用的对象的实际类型。...一个类型可以定义多个方法,让其中一个方法接受具体的数据类型,让另一个方法接受泛型类型参数。    ...(表示为:T:struct,可空类型不包含在内)    (3).构造函数类型约束:       构造函授类型约束:指定所有类型参数的最后一个约束,它检查类型实参是否有一个可用于创建实例的无参构造函数。

    3.4K90

    浅谈泛型

    有没有一种办法,让我们只写一遍算法的实现,就可以支持所有类型的数据?泛型(generic)是C#提供的一种机制,它可以提供这种形式的代码重用,即“算法重用”。...来看一个简单例子,Framework类库定义了一个泛型列表算法,它知道如何管理对象集合。泛型算法没有设定数据的类型。要在使用这个泛型列表算法时指定具体的数据类型。...泛型集合类具有更好的对象模型,提供了更多的新功能。 开放类型和封闭类型 具有泛型类型参数的类型仍然是类型,CLR同样会为它创建内部的类型对象。...使用泛型类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象从泛型类型派生自的那个类型派生。...所以,有没有更好的办法?我们利用泛型继承的特点是可以做到。

    1K30

    Effecvtive Java Note

    泛型 在没有泛型之前,从集合读取到的每一个对象都必须进行转换,如果有人不小心插入了类型错误的对象,在运行的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。...编译器自动为你的插入进行转化,并在编译时告知是否插入了类型错误的对象,这样更安全,也更清楚。...23.请不要在新代码中使用原生生态类型 使用原生生态类型会在运行时导致异常,因此不要在新代码中使用,原生态类型只是为了与引用泛型之前的遗留代码进行兼容和相互提供,set是个参数化类型,表示可以包含任何对象类型的一个集合...>是一个通配符,表示只能包含某种未知对象类型的一个集合,set则是个原生态类型,它脱离了泛型系统,前俩种是安全的,最后一种是不安全的。 24.消除非受检警告 非受检警告很重要,不要忽略它们。...26.优先考虑泛型 使用泛型比使用需要在客户端代码中进行转换的类型来得更加安全,也更加容易。在设计新类型的时候,要确保他们不需要这种转换就可以使用。这通常意味着这把类做成泛型的。

    73850

    Effecvtive Java Note

    泛型 在没有泛型之前,从集合读取到的每一个对象都必须进行转换,如果有人不小心插入了类型错误的对象,在运行的转换处理就会出错。有了泛型之后,可以告诉编译器每个集合中接受哪些对象类型。...编译器自动为你的插入进行转化,并在编译时告知是否插入了类型错误的对象,这样更安全,也更清楚。...23.请不要在新代码中使用原生生态类型 使用原生生态类型会在运行时导致异常,因此不要在新代码中使用,原生态类型只是为了与引用泛型之前的遗留代码进行兼容和相互提供,set是个参数化类型,表示可以包含任何对象类型的一个集合...>是一个通配符,表示只能包含某种未知对象类型的一个集合,set则是个原生态类型,它脱离了泛型系统,前俩种是安全的,最后一种是不安全的。 24.消除非受检警告 非受检警告很重要,不要忽略它们。...26.优先考虑泛型 使用泛型比使用需要在客户端代码中进行转换的类型来得更加安全,也更加容易。在设计新类型的时候,要确保他们不需要这种转换就可以使用。这通常意味着这把类做成泛型的。

    30310

    《编写高质量代码》学习笔记(2)

    ---- 建议93:Java的泛型是可以擦除的 Java泛型(Generic) 的引入加强了参数类型的安全性,减少了类型的转换,它与C++中的模板(Temeplates) 比较类似,但是有一点不同的是:...C++泛型生命期延续到了运行期,而Java是在编译期擦除掉的,我们想想,如果JVM也把泛型类型延续到运行期,那么JVM就需要进行大量的重构工作了。...明白了Java泛型是类型擦除的,我们就可以解释类似如下的问题了: 1.泛型的class对象是相同的:每个类都有一个class属性,泛型化不会改变class属性的返回值,例如: public static...>读取出的元素都是Object类型的,需要主动转型,所以它经常用于泛型方法的返回值。注意List 也可以读写操作,但是它执行写入操作时需要向上转型(Up cast),在读取数据的时候需要向下转型,而此时已经失去了泛型存在的意义了。

    1.7K40

    Java基础知识点总结

    2 外部类只有public和default两种修饰,要么全局可访问,要么包内可访问。 3 内部类可以有全部访问权限,因为它的概念就是一个成员变量,所以访问权限设置与一般的成员变量相同。...泛型 1 Java中的泛型是伪泛型,只在编译期生效,运行期自动进行泛型擦除,将泛型替换为实际上传入的类型。 泛型类用classA { } 2 这样的形式表示,里面的方法和成员变量都可以用T来表示类型。...泛型接口也是类似的,不过泛型类实现泛型接口时可以选择注入实际类型或者是继续使用泛型。 3 泛型方法可以自带泛型比如void go(); 泛型可以使用?...4 o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态,notify则是持有o锁对象的线程通知其他等待锁的线程获取锁。notify方法并不会释放锁。...当线程获取不到锁时则让线程阻塞,而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁。

    61930

    听GPT 讲Rust源代码--libraryproc_macro

    ArenaBox: ArenaBox是一个简单的盒子类型,它用于在Arena中持有一个对象的所有权。它内部包含了一个指向它所在的Arena对象的引用以及对象本身。...ProcMacro: 这个枚举表示处理的类型。它有三种类型:函数、过程宏和属性宏。这些类型用于在处理创建时标识并在处理使用时进行区分。...OwnedStore结构体的作用: OwnedStore结构体是一个持有句柄的数据结构,它用于存储特定类型的句柄,并提供了对这些句柄进行管理的功能。这个结构体具有如下功能: 存储和管理句柄对象。...:这是一个泛型结构体,用于表示闭包环境的类型。在Closure结构体中的Env字段的类型就是由泛型参数决定的。...这个结构体提供了一个泛型的接口,以便在编译时宏的执行过程中处理各种类型的闭包环境。 总的来说,Closure结构体和相应的泛型结构体提供了一个在编译时宏中处理闭包的机制。

    18810

    Java基础

    ,子类可以重写比较规则 notify() 多线程中唤醒功能 notifyAll() 多线程中唤醒所有等待线程的功能 wait()让持有对象锁的线程进入等待 wait(long timeout)让持有对象锁的线程进入等待...如果有,则让其共享那一个拷贝;只有没有才链接载入。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。...泛型 定义:泛型,即“参数化类型”。将类型作为参数传入方法中,如List。 优点:在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。...Java泛型的实现方法:类型擦除undefinedJava的泛型是伪泛型,因为Java在编译期间,所有的泛型信息都会被擦掉。...Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程称为类型擦除。 30.

    1.3K10

    .NET性能优化-使用Collections.Pooled

    , TValue> 泛型字典类 HashSet PooledSet 泛型哈希集合类 Stack PooledStack 泛型栈 Queue PooledQueue 泛型队列...IDispose接口,它通过Dispose()方法将使用的内存归还到池中,所以我们需要在使用完Pooled集合对象以后调用它的Dispose()方法。...由于它会复用内存空间,在将内存空间返回到池中的时候,需要对集合内的元素做处理,它提供了一个叫ClearMode的枚举供使用,定义如下: namespace Collections.Pooled {...这里和大家分享.NET BCL 中的一个类型,叫ArrayPool,它提供了可重复使用的泛型实例的数组资源池,使用它可以降低对 GC 的压力,在频繁创建和销毁数组的情况下提升性能。...来让它使用。

    38820

    听GPT 讲Rust源代码--compiler(6)

    这是一个泛型参数约束,它指定了一个类型T必须实现Trait这个trait。这个约束可以用于限制泛型类型的行为,从而保证代码的正确性。...SuggestAsRefKind是一个枚举,定义了多种可能的类型转换建议,该枚举用于修复类型不匹配的错误。它包含以下几种类型转换建议: Borrow:建议将值借用为引用。...substitute函数的目的是将一个CanonicalVarValues对象中的泛型类型参数替换为具体的类型。 在Rust中,泛型类型参数通常在编译器的类型检查阶段被转换为具体的类型。...它提供了substitute和其他类似的方法,用于替换泛型类型参数为具体的类型。 通过使用substitute方法,可以将泛型类型参数替换为具体的类型,从而进行类型检查和推导。...它包含了与类型相关的结构体、枚举和特质等。 TypeRelating 是一个泛型结构体,用于表示两个类型之间的关系。它有一个 relate_types 方法,用于比较两个类型。

    10410

    Java基础知识点总结

    外部类只有public和default两种修饰,要么全局可访问,要么包内可访问。 3. 内部类可以有全部访问权限,因为它的概念就是一个成员变量,所以访问权限设置与一般的成员变量相同。...Java中的泛型是伪泛型,只在编译期生效,运行期自动进行泛型擦除,将泛型替换为实际上传入的类型。 泛型类用classA { } 2. 这样的形式表示,里面的方法和成员变量都可以用T来表示类型。...泛型接口也是类似的,不过泛型类实现泛型接口时可以选择注入实际类型或者是继续使用泛型。 3. 泛型方法可以自带泛型比如void go(); 泛型可以使用?...4. o.wait方法会让持有该对象o的线程释放锁并且进入阻塞状态,notify则是持有o锁对象的线程通知其他等待锁的线程获取锁。notify方法并不会释放锁。...当线程获取不到锁时则让线程阻塞,而其他检查notify以后则会通知任意一个线程,所以这个锁时非公平锁。 6.

    56200
    领券