gpt4 book ai didi

java - 设计问题泛型/工厂/抽象类

转载 作者:行者123 更新时间:2023-12-01 12:01:16 26 4
gpt4 key购买 nike

我对 Java 编程还很陌生,我有一个设计问题。目前我得到的是以下内容:

public class MyFactory {

private MyFactory(){
//hidden constructor
}

public static ImageFilter getInstance(String filterType){
if(filterType == “foo“){
return new FooFilter();
}
return null;
}
}

public abstract class ImageFilter {
public abstract Bitmap filterImage(byte[] data);

//some other stuff
}

public class FooFilter extends ImageFilter {
public C filterImage(byte[] data){
//want to apply filterImageA or filterImageB depending what I put in
//at (*) and (**)
}

private A filterImageA(byte[] data){
//
}

private B filterImageB(byte[] data){
//
}
}

void main(byte[] data) {
ImageFilter bar = MyFactory.getInstance(“foo“);
BitmapType1 myBitmap = bar.filterImage(byte[] data); //(*)
BitmapType2 myBitmap2 = bar.filterImage(byte[] data); //(**)
}

在主要方法中我知道结果类型是什么。如果是 BitmapType1 我必须应用 filterImageA。如果是BitmapType2那么我必须使用filterImageB。有没有通用的方法可以做到这一点?我读过有关泛型的内容,但不知道如何在这种特殊情况下使用它们。我希望这不会太令人困惑。也许整个方法都是垃圾。欢迎提出更好的建议!

最佳答案

@Dima 的回答是正确的。但您也可以使 ImageFilter 更适合泛型:

public class MyFactory {

private MyFactory(){
//hidden constructor
}

public static ImageFilter getInstance(String filterType){
if(filterType == “foo“){
return new FooFilter();
}
return null;
}
}

public abstract class ImageFilter {
public abstract <T extends Bitmap> T filterImage(byte[] data, Class<T> clazz);

//some other stuff
}

public class FooFilter extends ImageFilter {
public <T extends Bitmap> T filterImage(byte[] data, Class<T> clazz){
if (BitmapType1.class.isAssignableFrom(clazz)) {
return this.filterImageA(data);
} else if (BitmapType2.class.isAssignableFrom(clazz)) {
return this.filterImageB(data);
}
return null; // or better throw runtime exception
}

private BitmapType1 filterImageA(byte[] data){
//
}

private BitmapType2 filterImageB(byte[] data){
//
}
}

void main(byte[] data) {
ImageFilter bar = MyFactory.getInstance(“foo“);
BitmapType1 myBitmap = bar.filterImage(byte[] data, BitmapType1.class);
BitmapType2 myBitmap2 = bar.filterImage(byte[] data, BitmapType2.class);
}

注意:如果 BitmapType1 继承(直接或不直接)自 BitmapType2 或反之亦然,您需要首先检查层次结构中最具体的类:

        if (BitmapType1.class.isAssignableFrom(clazz)) { // BitmapType1 type more concrete
return this.filterImageA(data);
} else if (BitmapType2.class.isAssignableFrom(clazz)) { // BitmapType2 type more general
return this.filterImageB(data);
}

关于java - 设计问题泛型/工厂/抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27969617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com