默认生成的接口实现方法体的问题
创始人
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”的行为。

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

相关内容

热门资讯

诗词的由来? 诗词的由来?几年前?为啥来?诗歌概念起源 诗歌是一种主情的文学体裁,它以抒情的方式,高度凝练,集中地...
陈梦佳是好人吗? 陈梦佳是好人吗?我不了解TA
关于鹏的成语典故? 关于鹏的成语典故?据一个叫庄周的说这货在水里是鱼名鲲,上了天变成鸟叫鹏,纵横几千里,如垂天之云。据西...
上夜班很困怎么办, 上夜班很困怎么办, 白天多休息。注意饮食营养。晚上上班的时候可以听听节奏比较快的歌,或者听自己一向...
男生不主动找聊天就是没戏吧? 男生不主动找聊天就是没戏吧?你分情况,不同性格的人不一样。比如说处女男,因为天性原因希望女孩子主动一...
说人守时回家的成语 说人守时回家的成语 分秒必争 [fēn miǎo bì zhēng] 生词本基本释义一分一秒也一...
大航海探险物语要在什么辅助脚本... 大航海探险物语要在什么辅助脚本玩呢?大航海探险物语要在鸟人助手上玩呀,这款辅助脚本不用root一样可...
怎样锻炼孩子注意力集中? 怎样锻炼孩子注意力集中?第一,多训练孩子听力,在孩子听某些声音或语言,能听懂其中的细节和主旨。第二,...
本来可爱的小家伙,变成了难管教... 本来可爱的小家伙,变成了难管教的熊孩子,孩子太难管教了怎么办呢?多跟孩子沟通,走进孩子的内心,了解她...
孩子跳舞发圈简单句子 孩子跳舞发圈简单句子1、爸爸妈妈会为你在赛场上的努力而感到骄傲。我们爱你。2、感觉女儿特别的用心,在...
我女朋友和我说她只是喜欢我而不... 我女朋友和我说她只是喜欢我而不爱我,我还怎么办?就是因为你平时对她的宠爱,,让她变成了理所当然,,她...
关于通缉令的问题! 关于通缉令的问题!分级别的。A级才能公布大众的。如果你想曝光此事,可以找当地媒体。。。。
湖南涉外经济学院教师车祸造成 ... 湖南涉外经济学院教师车祸造成 2 人受伤,事故原因是什么?这是因为他们的心情不好的原因,所以,这样的...
微电影创作过程中,工作思路怎么... 微电影创作过程中,工作思路怎么写请问你说的是剧本创作还是拍摄工作,还是整个流程?
求类似异形大战铁血战士这样的把... 求类似异形大战铁血战士这样的把两部不同电影里的人物放到一起对打的电影弗莱迪大战杰森
喜欢看小说的进来 喜欢看小说的进来小说里面都有那些 剑法 轻功 剑名(倚天剑 )门派(专收女弟子的名字要好听的)风云也...
顾瑶周夜深小说叫什么名字? 顾瑶周夜深小说叫什么名字?不是冤家不成婚场景一:“贺尧谦你会有报应的!”某女手握拳头信誓旦旦。“放心...
永恒之塔各种达人(6种),前期... 永恒之塔各种达人(6种),前期中期后期分别做什么东西好卖?永恒之塔各种达人(6种),前期中期后期分别...
用精字组成不同的词语填空 用精字组成不同的词语填空节目( ) 制作( ) 装备( ) 包装( ) ( ...
什么是白富美?什么是高富帅? 什么是白富美?什么是高富帅?白富美就是长得白净、有钱、美丽漂亮,一般形容女的,高富帅是长得个子高,又...