中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

java~PECS原則

PECS(Producer Extends, Consumer Super)是Java泛型編程(cheng)中的一(yi)個(ge)重要原則,用(yong)于(yu)指導如何(he)使用(yong)通(tong)配符以增強代碼的靈活(huo)性(xing)和可重用(yong)性(xing)。PECS原則可以分為(wei)兩個(ge)部分:

  1. Producer Extends

    • 當你需要從某個集合中讀取數據時,應該使用? extends T。這表示該集合可以是T或其子類的類型。
    • 適用于生產者(提供數據)的場景。
  2. Consumer Super

    • 當你需要向某個集合中寫入數據時,應該使用? super T。這表示該集合可以是T或其父類的類型。
    • 適用于消費者(接收數據)的場景。

遵循PECS原則的好處

  • 類型安全:使用PECS原則可以確保在編譯時進行類型檢查,從而減少運行時錯誤。
  • 代碼靈活性:允許更廣泛的類型使用,使得代碼更加靈活和可重用。
  • 簡化復雜性:通過明確區分生產者和消費者的行為,可以使代碼的意圖更加清晰。

Java示例

java.util.Collections.copy方法使用了pecs原則

下(xia)面是一個示例,展示如何遵循PECS原則。我們將創(chuang)建(jian)一個簡(jian)單的(de)類來演示生產(chan)者(zhe)和(he)消費者(zhe)的(de)使用。

示例代碼

import java.util.ArrayList;
import java.util.List;

// 定義一個動物類及其子類
class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

// 使用PECS原則的生產者方法
public class PECSExample {

    // 生產者方法:接受一個包含Animal或其子類的列表
    public static void printSounds(List<? extends Animal> animals) {
        for (Animal animal : animals) {
            animal.makeSound(); // 調用每個動物的發聲方法
        }
    }

    // 消費者方法:接受一個包含Animal或其父類的列表
    public static void addDog(List<? super Dog> dogs) {
        dogs.add(new Dog()); // 可以添加Dog對象
    }

    public static void main(String[] args) {
        List<Dog> dogList = new ArrayList<>();
        dogList.add(new Dog());

        List<Cat> catList = new ArrayList<>();
        catList.add(new Cat());

        // 使用生產者方法
        System.out.println("Animal Sounds:");
        printSounds(dogList); // 輸出:Woof
        printSounds(catList);  // 輸出:Meow

        // 使用消費者方法
        List<Animal> animalList = new ArrayList<>();
        addDog(animalList); // 添加Dog到Animal列表
        for (Animal animal : animalList) {
            animal.makeSound(); // 輸出:Woof
        }
    }
}

代碼分析

  1. 動物類

    • Animal是一個基類,DogCat是其子類,分別實現了makeSound()方法。
  2. 生產者方法

    • printSounds(List<? extends Animal> animals)方法接受一個Animal或其子類的列表,并打印每個動物的聲音。
  3. 消費者方法

    • addDog(List<? super Dog> dogs)方法接受一個Dog或其父類的列表,并向其中添加Dog對象。
  4. 主方法

    • 創建DogCat的列表,并調用生產者方法打印它們的聲音。
    • 創建一個Animal類型的列表并使用消費者方法添加Dog對象。

SOLID中的里氏替換原則

// 入參是RedDog或者是它的父類
int sumInt(List<? super RedDog> list) {
		list.add(new RedDog("d1", true));
		list.forEach(o -> {
			((RedDog) o).makeSound();// 直接使用RedDog對象,符合里氏替換的原則,子類可以替換父類
		});
		return 0;
}

// 方法內部為父類集合賦值,在外面使用時,暴露出父類(子類公共字段和方法)來訪問
List<? extends Dog> getDogs() {
		List<Dog> list = new ArrayList<>(); // 返回的集合中,有多種Dog的子類,在調用方使用時,是以dog的方式對外暴露的
		list.add(new RedDog("d1", true));
		list.add(new RedDog("d2", true));
		list.add(new BlackDog("black1", false));
		return list;
	}

總結

通過遵循PECS原(yuan)則,我們能(neng)夠更好(hao)地(di)管理泛型類型的使用,提高代碼的靈活性和(he)可讀性,同時保(bao)持(chi)類型安全(quan)。這種方式使得開發者在處理復雜數據結構時能(neng)夠更有效(xiao)地(di)組織代碼。

參考:

posted @ 2022-04-14 16:25  張占嶺  閱讀(306)  評論(0)    收藏  舉報