默认生成的接口实现方法体的问题
创始人
2024-05-26 06:38:08
0

随着集成开发环境越来越强大,编程开发工作也变得越来越高效,很多的代码都不需要逐字输入,可以利用代码生成和自动补全来辅助开发。但是这样的便利也可能引起一些疏忽,本文就Java开发中默认生成的接口实现方法来谈谈以前遇到的问题。

平时做Java开发的时候,我们经常需要去实现他人定义的接口,这个时候通常写完implements xxxx的代码后,使用开发工具来生成缺少的空方法,例如下面这样:

class ATask implements Runnable {@Overridepublic void run() {}
}

这么做可以让我们节省一些时间。上面的例子是最简单的情况,实际开发中情况要复杂的多。下面来看看复杂情况下可能出现的问题

问题一:方法很多并包含很多空实现

有时候用第三方库的时候,经常看到回调的接口中包含5个以上的方法,而这些方法并不是都需要用到,那么就会出现很多的空方法体,比如像Android播放器ExoPlayerEventListener就包含了7个方法:

public interface EventListener {void onTimelineChanged(Timeline var1, Object var2);void onTracksChanged(TrackGroupArray var1, TrackSelectionArray var2);void onLoadingChanged(boolean var1);void onPlayerStateChanged(boolean var1, int var2);void onPlayerError(ExoPlaybackException var1);void onPositionDiscontinuity();void onPlaybackParametersChanged(PlaybackParameters var1);
}

但这些方法我们并不是都要用到,所以可能在相关功能的实现中存在很多空方法体,像这样:

@Override
public void onTimelineChanged(Timeline timeline, Object o) {}@Override
public void onTracksChanged(TrackGroupArray trackGroupArray, TrackSelectionArray trackSelectionArray) {}@Override
public void onLoadingChanged(boolean b) {}@Override
public void onPlayerStateChanged(boolean b, int i) {}@Override
public void onPlayerError(ExoPlaybackException e) {}@Override
public void onPositionDiscontinuity() {}@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {}

不仅占据大量篇幅, 而且还可能引起歧义:这些方法到底是可忽略的,还是忘记实现的,又或是当时可忽略,将来需要实现的?

针对可忽略的,我们可以像AnimationAdapterListener那样,定义一个适配器接口,将那些忽略的方法放在这样的Adapter中:

public class AnimationAdapterListener implements Animation.AnimationListener {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {}@Overridepublic void onAnimationRepeat(Animation animation) {}
}

然后原本使用AnimationListener的地方,就用AnimationAdapterListener,然后将重写关注的方法即可,这样就不会出现大量的空方法

如果这些方法都不是可忽略的,还是建议在默认生成的方法体中通过注释、日志、甚至抛出异常等方式填充内容,起到一个补充说明的作用,以免将来看着空方法体一头雾水。当然如果IDE允许,尽量还是生成带有信息的方法体,例如下面这样:

class ATask implements Runnable {@Overridepublic void run() {//TODO not implement}
}

问题二:生成的方法体的默认返回值问题

当接口声明的方法带有返回值的时候,IDE辅助生成的空方法体可能包含默认返回值,例如,接口返回值是boolean时,默认返回false

class Obj implements XXXInter{@Overridepublic boolean isXXX(){return false;}
}

或许在最初开发的时候,这种情况是可以忽略的,但是过段时间或者经历多人维护以后,就没法区分是“设计如此”还是“无意为之”的结果。对于熟悉的接口不会造成太大问题,如果是不太熟悉的第三方库的接口,那就可能因为疏忽而导致难以预料的情况。

针对有返回值的方法,还是建议默认实现采用抛出异常的方式:

class Obj implements XXXInter{@Overridepublic boolean isXXX(){throw new RuntimeException("not implement");}
}

只有在明确功能的情况下,才返回具体的值。

问题三:实现不同接口的同名方法

最后一个问题非常少见,但是一旦出现,就可能导致比较诡异的bug。

实际开发中一个类可能会实现3个甚至5个接口,如果这些接口包含方法签名相同的方法,那么IDE辅助生成的方法实现中同签名方法只会有一个方法体,例如:

interface A {void testA();boolean isValid();
}interface B {void testB();boolean isValid();
}class ATask implements A,B {@Overridepublic void testA() {}@Overridepublic void testB() {}@Overridepublic boolean isValid() {return false;}
}

这里接口AB都包含isValid方法声明,但是ATask中只有一个isValid实现,如果AB中该方法的意义不同,那么情况又比较麻烦了。在开发阶段就发现,可以通过内部类或辅助类的方式来分离两个接口的实现;但如果已经是在老项目中出现这样的代码,那么就可能在不知道这个方法同时属于两个接口的情况下去改动进而出现“写bug”的行为。

对于这个问题,可以按照“单一职责”的思想,一个类尽量不要实现太多接口,保持其职责的单一。如果某些特殊情况真的需要一个方法同时实现两个接口的情况,还是建议补充注释来强调下。

相关内容

热门资讯

小学课文叶公好龙的意思是什么 小学课文叶公好龙的意思是什么叶公好龙是一句成语,讲述了叶公爱龙成癖,被天上的真龙知道后,便从天上下降...
完美世界前传图一图二图三的问题... 完美世界前传图一图二图三的问题?我是电二龙现的,101魔尊,图我都开完了,图一可进 千年前天泪之城图...
声开头的四字成语大全 声开头的四字成语大全声开头的四字成语大全 :声色俱厉、声如洪钟、声泪俱下、声情并茂、声东击西、声嘶力...
网络时代消费者心理特征和行为特... 网络时代消费者心理特征和行为特征是怎样的由于它能够提供丰富的商品信息,突破时空的限制,具有低廉的价格...
人生如梦,后面一句是什么 人生如梦,后面一句是什么人生如梦 一樽还酹江月人生如梦,需及时醒来,面对现实一樽还酹江月
求青梅竹马的小说 求青梅竹马的小说总是推的我都看过,多推点吧《夏有乔木,雅望天堂》感人死呢!!!!玄幻小说中有很多
想你第15集里面尹恩惠用的彩笔... 想你第15集里面尹恩惠用的彩笔是什么牌子的?这是马克笔 不管什么牌子效果都一样、和普通彩笔不同的就是...
焉栩嘉被痛斥劈腿背叛,情感失格... 焉栩嘉被痛斥劈腿背叛,情感失格的偶像算劣迹艺人吗?我认为情感失格的偶像应该就算是劣迹艺人人,因为他们...
求异界类似 {异界逍遥公}!和... 求异界类似 {异界逍遥公}!和幻神这样的! 或都市类的像 {龙啸九天-人界风云篇}!!主角蓝玉!我来...
我是从教师转行到财产保险公司做... 我是从教师转行到财产保险公司做保险营销员的,是个到公司快一年的新人,现在急求一份年终总结啊?manm...
改写人生是什么意思? 改写人生是什么意思?就是完全打破以往的人生规划,迎接一个不一样的人生。
找一本主角牙口特别好的小说? 找一本主角牙口特别好的小说?完美世界吗?
无双无对无法比打一数字? 无双无对无法比打一数字?无双无对无法比的数字是0。因为两个O仍是O。
一切都为了生活,那生活又为了什... 一切都为了生活,那生活又为了什么?生活就是你的一切,生活?生存活着!你的所有的努力只是为了活着,为了...
喜欢安静的人是什么性格 喜欢安静的人是什么性格喜欢安静的人通常本身也是比较文静的人,这类人的性格会属于内敛,内向型的。内向、...
哪个播放器能看《一生一世》 哪个播放器能看《一生一世》不好看,暴风影音就有哇如果有关视频的格式是播放器支持的都能看或播放
心里莫名的悸动是什么? 心里莫名的悸动是什么?心里老是莫名的悸动 搞不懂耶失眠、健忘、眩晕、耳鸣等并存,凡各种原因引起心脏搏...
怎样训犬 怎样训犬受训犬是指接受训练的犬。受训犬一般要求除符合本品种的特征外,还应注意:(1)体形外貌。机体各...
天为什么会黑? 天为什么会黑?这是因为地球自转造成的日月更替。地球绕太阳是公转,而在公转的同时地球也在自转。当地球自...
为什么前男友屏蔽朋友圈不让我看... 为什么前男友屏蔽朋友圈不让我看,但是又不删除我?为什么会这样啊都已经让对方变成前任啦!还纠结这些干嘛...