第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java泛型-太復(fù)雜了嗎?如何簡化?

Java泛型-太復(fù)雜了嗎?如何簡化?

繁華開滿天機 2021-04-29 15:12:02
最初我在CodeReview上發(fā)布了該問題,但這可能更適合StackOverflow。我正在使用Java 6為多步驟過程進行編碼。假設(shè)其中有3個步驟。每個接受相同類型的輸入。讓我們開始。這是作為輸入傳遞到每個步驟的對象。除了某些步驟的共享值外,該對象還用作另一種對象的包裝。請注意,姓名已翻譯成更通用的域名,并且英文使用的是英文原文。public class EntityStepInput<T extends Entity> {    public final T entity;    public boolean modified;    public boolean canceled;    public EntityStepInput(final T entity) {        this.entity = entity;    }}這是每個步驟使用的接口。public interface EntityStep<T extends EntityStepInput<? extends Entity>> {    void process(final T stepInput) throws Exception;}現(xiàn)在,三個步驟中的兩個必須接受一個EntityStepInput包含Entity或從其派生的任何類型的。public class FirstEntityStep implements EntityStep<EntityStepInput<? extends Entity>> {    @Override    public void process(final EntityStepInput<? extends Entity> stepInput) throws Exception {}}public class SecondEntityStep implements EntityStep<EntityStepInput<? extends Entity>> {    @Override    public void process(final EntityStepInput<? extends Entity> stepInput) throws Exception {}}最后一步必須接受,EntityStepInput其中包含從派生的特定類型Entity。public class ThirdEntityStep implements EntityStep<EntityStepInput<? extends DerivedEntity>> {    @Override    public void process(final EntityStepInput<? extends DerivedEntity> stepInput) throws Exception {}}用法很簡單。我有接受不同類型Entitys的重載方法。接下來是一個簡化的版本。public void workWithEntity(final DerivedEntity entity) throws Exception {    final EntityStepInput<DerivedEntity> stepInput = new EntityStepInput<DerivedEntity>(entity);    stepOne.process(stepInput);    stepTwo.process(stepInput);    stepThree.process(stepInput);}如您所見,該DerivedEntity類型能夠使用所有步驟。public void workWithEntity(final OtherDerivedEntity entity) throws Exception {    final EntityStepInput<OtherDerivedEntity> stepInput = new EntityStepInput<OtherDerivedEntity>(entity);    stepOne.process(stepInput);    stepTwo.process(stepInput);}在這里,另一種類型的Entity不能使用最后一步,這就是我想要的?,F(xiàn)在,使用泛型變得相當(dāng)復(fù)雜。我擔(dān)心誰會在我走后閱讀我的代碼,這將不理解,遲早會造成混亂。這是可簡化的嗎?在遵循單一責(zé)任原則的前提下,您想采取什么方式來尊重他人?編輯。Entity層次結(jié)構(gòu)如下:Entity > DerivedEntityEntity > OtherDerivedEntity
查看完整描述

2 回答

?
呼如林

TA貢獻1798條經(jīng)驗 獲得超3個贊

一個較小的變化僅僅是為了簡化類型變量聲明在EntityStep一個Entity代替的EntityStepInput:


interface EntityStep<E extends Entity> {

    void process(EntityStepInput<? extends E> i);

}

然后:


class FirstEntityStep implements EntityStep<Entity> {

    @Override

    public void process(EntityStepInput<? extends Entity> i) {}

}

class SecondEntityStep implements EntityStep<Entity> {

    @Override

    public void process(EntityStepInput<? extends Entity> i) {}

}

class ThirdEntityStep implements EntityStep<DerivedEntity> {

    @Override

    public void process(EntityStepInput<? extends DerivedEntity> i) {}

}

它與以前完全相同,但是聲明更容易理解。


僅T extends EntityStepInput<...>在要使用某些特定的子類時才需要,但由于始終EntityStepInput直接使用,因此不需要。


查看完整回答
反對 回復(fù) 2021-05-26
  • 2 回答
  • 0 關(guān)注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號