首页 > 编程知识 正文

java重载返回值类型可以不同吗,java什么叫重载

时间:2023-05-04 04:59:28 阅读:158082 作者:2119

问题一直以来,重载(Overload )作为java语言的重要语言特性,介绍了需要重载的情况。 方法需要处理多个类型的参数,而为每个类型生成重载的方法有多个参数,有些参数即使不传递也具有默认值,初始化为每个类型生成重载的方法类需要多个参数为每种类型生成重载构建方法的优点。 如果每个重载方法实现的逻辑不同,则该方法的重载将表明java中对象多态性的缺点。 重载的每个方法实现的逻辑完全相同,重载只会生成大量的重复代码,以应对某些参数未传递或存在默认值的情况。 每个重载方法实现的逻辑都完全相同。 为了应对某些参数未传递或有缺省值的情况,重载包括与问题相关的概念java重载的关联定义java方法签名方法的名称和构成参数列表java的方法签名方法,这些概念会导致大量代码重复唯一确定将方法java方法重载到类中,该方法名称相同,但参数类型列表不同。 返回类型可以相同也可以不同。 两种方法称为方法重载,这两种方法的方法签名以不同的方式重写。要对同一个重载规则:的重载方法进行签名,必须修改参数列表() 重载方法可以更改重载返回类型的方法,也可以更改重载访问修饰符的方法。 新的或更宽的检查异常方法在同一个类内或某个子类内重载,不能以返回类型作为过载函数的标准方法的重载使用java中类的多态性表示的java可变参数调用时只能在参数列表的末尾传递多个参数,并且可以通过在方法中作为数组访问并使用' Object… args '可变参数来减少上述问题。 如果禁用了参数类型检查,代码可读性严重降低,静态语言失去了优势,并且希望在方法内部进行访问,则还必须确定参数数组的长度,以确保用户收到了某些参数。 我个人知道可变参数适合类型,但0-n个参数创建者模型主要解决软件系统中“复杂对象”的创建工作。 通常,各部分的子对象由一定的算法构成。 随着需求的变化,这个复杂对象的各个部分总是会发生变化,但组合算法相对稳定。 如果一个对象的参数很多的话,如果都写在构造方法上的话,用户就很难明白了。 可以使用生成器模型进行简化。 当然,也可以使用构建方法的重载,但重载的构建方法非常多//** 使用者不需要了解所有参数,然后再调用他们正在使用的参数returnrefreshtokenjwtverifier.builder.new builder (redis template ).accestokenexexx ime ) )使用构建实例模式可以解决初始化类需要多个参数的问题。 某些参数不会传递,或者有默认值。 为每种类型生成重载的构建方法,但相应地生成其他代码的javascript和python的关联定义方法签名方法名称是方法签名。 方法名称唯一确定了方法重载没有方法重载的概念。 如果类中有两个同名的方法,则会复盖前一个方法,并且只有最后启用的python的语言特性(如动态类型、缺省参数、可变参数(*、** )和关键字参数)会导致单个方法名称默认参数,高级运算符…。 有几个参数可以忽略参数列表,传递任何参数,并使用内部变量arguments获取所有参数变量实例中出现的问题/**request方法。 其中只有url的method是必需的,不要传递params。 hasHeader缺省称为true,它写有四个重载方法以方便调用。 大量重复代码*/public class test { @ autowiredprivatetestresttemplateresttemplate; protectedstringaccesstoken=' test '; publicstaticstringaccess _ token _ key=' authorization '; protectedresponseentityapiresponserequest (string URL,httpmethodmethod (return this.request ) URL,method,null, true } protectedresponseentityapiresponserequest (string URL,http method,boolean hasHeader ) returnthis.request ) urn } protectedresponseentityapiresponserequest (string URL,HttpMethod method,MultiValueMapString, 参数(return this.request ) ) URL, method, params, true); } /**最终的逻辑代码,如果只写这一个方法,调用不方便:request(url, GET, null, true) 重载后的调用:request(url, GET)*/ protected ResponseEntity<ApiResponse> request(String url, HttpMethod method, MultiValueMap<String, ?> params, boolean hasHeader){ HttpEntity<Map<String, ?>> entity = hasHeader ? new HttpEntity<>(params, this.getHeaders()) : new HttpEntity<>(params); return restTemplate.exchange(url, method, entity, ApiResponse.class); } private MultiValueMap<String, String> getHeaders(){ ... }} java的解决方案 //**1.可变参数public class Test { @Autowired private TestRestTemplate restTemplate; protected String accessToken = "test"; public static String ACCESS_TOKEN_KEY = "Authorization"; //**参数类型检查会失效,可读性极差 //**在方法内部,需要一些额外的处理逻辑 //**可变参数适用于类型一样,但个数为0-n的参数 //**调用方式:request(url, GET) protected ResponseEntity<ApiResponse> request(String url, HttpMethod method, Object... args){ MultiValueMap<String, ?> params = null; boolean hasHeader = true; for(Object arg : args){ if(arg instanceof MultiValueMap) params = (MultiValueMap<String, ?>)arg; else if(arg instanceof Boolean) hasHeader = (Boolean)arg; } HttpEntity<Map<String, ?>> entity = hasHeader ? new HttpEntity<>(params, this.getHeaders()) : new HttpEntity<>(params); return restTemplate.exchange(url, method, entity, ApiResponse.class); } private MultiValueMap<String, String> getHeaders(){ ... }}//**2.如果是参数为成员变量,则可使用建造者模式public class Test { @Autowired private TestRestTemplate restTemplate; protected String accessToken = "test"; public static String ACCESS_TOKEN_KEY = "Authorization"; private String url; private HttpMethod method; private MultiValueMap<String, ?> params; private boolean hasHeader = true; private Test(){} //**调用方式:Test.Builder.newBuilder().build(url, GET).request(); protected ResponseEntity<ApiResponse> request(){ HttpEntity<Map<String, ?>> entity = hasHeader ? new HttpEntity<>(params, this.getHeaders()) : new HttpEntity<>(params); return restTemplate.exchange(url, method, entity, ApiResponse.class); } //**需要生成多余的代码Builder类 //**如果可选参数很多,建造者模式是一个非常好的方法 public static class Builder { private Test test; private Builder() {} public static Builder newBuilder() { Builder builder = new Builder(); builder.test = new Test(); return builder; } public Builder params(MultiValueMap<String, ?> params) { this.test.params = params; return this; } public Builder hasHeader(boolean hasHeader) { this.test.hasHeader = hasHeader; return this; } public Test build(String url, HttpMethod method){ this.test.url = url; this.test.method = method; return this.test; } } private MultiValueMap<String, String> getHeaders(){ ... }} javascript的解决方案 //**javascript函数任何参数都可不传,如果没有设置默认值,则默认为nullclass Test { constructor (){ this.accessToken = "test"; this.ACCESS_TOKEN_KEY = "Authorization"; } //**写法1:调用request(url, GET) //**如果params不需要,但hasHeader为false,调用request(url, GET, null, false) request(url, method, params, hasHeader = true){ let entity = hasHeader ? new HttpEntity(params, this.getHeaders()) : new HttpEntity(params); return restTemplate.exchange(url, method, entity, ApiResponse.class); } //**写法2:调用request(url, GET) //**如果params不需要,但hasHeader为false,调用request(url, GET, null, false) //**本函数可接收任何参数,所以javascript不存在函数重载 request(){ let [url, method, params, hasHeader] = arguments hasHeader = hasHeader == null ? true : hasHeade let entity = hasHeader ? new HttpEntity(params, this.getHeaders()) : new HttpEntity(params); return restTemplate.exchange(url, method, entity, ApiResponse.class); } //**javascript的扩展运算符(...),在这里把所有参数合并成args数组 def request(...args): pass getHeaders() { ... }} python的解决方案 //**python函数参数默认参数可不传,值为设置的默认值//**python支持关键字参数,可直接指定参数名=值,如request(hasHeader=false)class Test : ACCESS_TOKEN_KEY = "Authorization" def __init__(self): self.accessToken = "test" //**调用request(url, GET) //**如果params不需要,但hasHeader为false,调用request(url, GET, hasHeader=false) def request(self, url, method, params=None, hasHeader=True): entity = HttpEntity(params, this.getHeaders()) if hasHeader else HttpEntity(params) return restTemplate.exchange(url, method, entity, ApiResponse.class) //***args1接收所有普通参数,args2接收所有的关键字参数 //**本函数可接收任何参数,所以python不存在函数重载 def request(*args1 **args2): pass def getHeaders(self): pass 总结 java 没有找到比较合适的替代方法,为了方便调用,本人还是继续使用重载 javascript 大部分情况下,都能够以比较简化的方式调用函数不能重载,所以如果params不需要,但hasHeader为false,只能使用request(url, GET, null, false)方式调用 python 默认参数和关键字参数处理此类问题非常方便,是比较理解的处理方法在构造方法有多个参数时,也可以使用此方法,调用时和java的建造者模式一样,只需关心自己使用的参数

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。