0

ジェネリックを使用するプログラムとジェネリックを使用しないプログラムの 3 つのプログラムを作成しました。

isAssignableFrom の使用

public class ObjectSpecificCondition {
    private Class classType;

    public boolean check(Object obj) {
        boolean check = ((DateObject) obj).getLocalizationdate();
    }

    public ObjectSpecificCondition(Class classType) {
        this.classType = classType;
    }

    boolean checkTypeSpecific(Object busineesObject) {
        if (classType.isAssignableFrom(busineesObject.getClass())) {
            return true;
        }
        else{
            throw new Exception();
        }

    }

instanceOf の使用

class ObjectSpecificCondition1 {

    public boolean check(Object busineesObject) {
        boolean check ;

        if(busineesObject instanceof DateObject){
            check= ((DateObject) busineesObject).getLocalizationdate();
        }
        else{
             throw new IllegalArgumentException();
        }
        return check;
    }

    }

ジェネリックの使用

class ObjectSpecificConditionGenerics<T extends DateObject> {
    private T classTypeGenerics;

    public boolean check(T genericsobj) {
        genericsobj.getLocalizationdate();

    }

}

ビジネス オブジェクト ルール

class DateObject {
    boolean getLocalizationdate() {
        // return true Or False according to business logic
    }
}

Main test
 public static void main(String[] args) throws Exception {
        DateObject mockdateObject = new DateObject();
        // caseI: No generics used caseI works fine no exception is generated but more lines of code to write
        ObjectSpecificCondition mockanalysis = new ObjectSpecificCondition(DateObject.class);

        if (mockanalysis.checkTypeSpecific(mockdateObject)) {
            mockanalysis.check(mockdateObject);

        }
     // caseII:No generics used caseII throws exception in run time .More lines of code to write.It can not capture incompatible type at compile time 
        ObjectSpecificCondition mockanalysis1 = new ObjectSpecificCondition(String .class);
        DateObject mockdateObject1 = new DateObject();
        if (mockanalysis.checkTypeSpecific(mockdateObject1)) {
            mockanalysis.check(mockdateObject1);

        }
       // caseIII;Generics used and line of code is reduced to less 
        ObjectSpecificConditionGenerics mockgenerics=new ObjectSpecificConditionGenerics() ;
        mockgenerics.check(mockdateObject);

        // caseIV;Generics used and line of code is reduced to less and error for compataible object is generated at compile time 
        ObjectSpecificConditionGenerics mockgenerics1=new ObjectSpecificConditionGenerics() ;
        String mockstring=new String();
        mockgenerics.check(mockstring); // it is captured at compile time ,i think its good to catch at compile time then to pass it at run time 

    }
}

私は 3 つのアプローチを使用するフレームワークで見られます。どれが最適かをもっと確認したいですか?ジェネリックを使用すると、コード行が少なくなり、コンパイル時にエラーが発生する可能性があります。しかし、別のアプローチもより多く使用されます。より深い答えを得る.助けてください

4

1 に答える 1

0

ジェネリック バージョンと非ジェネリック バージョンは同じである必要があり、唯一の違いは型パラメーターとキャストです。非ジェネリック バージョンは、ジェネリック バージョンの型消去である必要があります。型消去変換を適用することにより、任意のジェネリック コードを同等の非ジェネリック コードに変換できます。

ジェネリックを使用しない

public class ObjectSpecificCondition {
    private Class classType;

    public boolean check(DateObject obj) {
        boolean check = obj.getLocalizationdate();
    }

    public ObjectSpecificCondition(Class classType) {
        this.classType = classType;
    }

    boolean checkTypeSpecific(Object busineesObject) {
        if (classType.isInstance(busineesObject)) {
            return true;
        }
        else{
            throw new Exception();
        }

    }
}

ジェネリックの使用

public class ObjectSpecificCondition<T extends DateObject> {
    private Class<T> classType;

    public boolean check(T obj) {
        boolean check = obj.getLocalizationdate();
    }

    public ObjectSpecificCondition(Class<T> classType) {
        this.classType = classType;
    }

    boolean checkTypeSpecific(Object busineesObject) {
        if (classType.isInstance(busineesObject)) {
            return true;
        }
        else{
            throw new Exception();
        }

    }
}
于 2013-09-13T22:04:32.157 に答える