Background

I learned Factory pattern, and the power of generics and I'm attempting to piece them together.

Here are my efforts

Without generic input parameter - No warnings

public abstract class ArtifactCreator {
    public abstract void setArtifacts(String workflowInput);
}

public class FooArtifactCreator extends ArtifactCreator {

    @Override
    public void setArtifacts(String input) {
        return null;

    }
}

public class BarArtifactCreator extends ArtifactCreator {
    @Override
    public void setArtifacts(String input) {
        return null;

    }
}

public class Factory {
    public ArtifactCreator getArtifactCreator(String domain) {
        if (domain == "foo") {
            return new FooArtifactCreator()
        } else if (domain == "bar") {
            return new BarArtifactCreator()
        }
        return null;
    }
}

My whole problem is the workflowInput is relegated to the type String. But I want it to be some generic POJO.

With generics - I get warnings in Factory.java and Store.java that I want to get rid of correctly. (I want to be using generics for my use-case the right way).

  1. Raw use of parameterized class 'ArtifactCreator' on both the files in Store.java and Factory.java

  2. Unchecked call to 'setArtifacts(T)' as a member of raw type 'ArtifactCreator' in Store.java

    public abstract class ArtifactCreator { public abstract void setArtifacts(T workflowInput); }


public class FooArtifactCreator extends ArtifactCreator<FooInput> {

    @Override
    public void setArtifacts(FooInput input) {
        return null;
    }
}

public class BarArtifactCreator extends ArtifactCreator<BarInput> {
    @Override
    public void setArtifacts(BarInput input) {
        return null;

    }
}

public class Factory {
    public ArtifactCreator getArtifactCreator(String domain) {
        if (domain == "foo") {
            return new FooArtifactCreator()
        } else if (domain == "bar") {
            return new BarArtifactCreator()
        }
        return null;
    }
}

public class Input {
    private String domain;
    private String otherInput;
}

public class Store {

    private final Factory factory;
    public Store(Factory factory) {
        this.factory = factory;
    }

    public ArtifactCreator getCaseClosureArtifactFactory(Input req) {
        ArtifactCreator artifactCreator = factory.setArtifacts(req.getDomain());

        //In reality - Create either FooInput or BarInput depending on 
        //`otherInput` field in `Input` POJO. Assume that there will be another 
        //factory/HashMap to return the input needed

        FooInput input = new FooInput();
        artifactCreator.setArtifacts(input);
    }

}

One way I can think of solving my problems is do something like:

public class WorkflowInput {
    private FooInput input;
    private BarInput input;
}



public abstract class ArtifactCreator {
    public abstract void setArtifacts(WorkflowInput workflowInput);
}


public class FooArtifactCreator extends ArtifactCreator {

    @Override
    public void setArtifacts(WorkflowInput input) {
        FooInput input = input.getFooInput(); //Extract specific input

    }
}

public class BarArtifactCreator extends ArtifactCreator {
    @Override
    public void setArtifacts(WorkflowInput input) {
        BarInput input = input.getBarInput(); //Extract specific input

    }
}

This feels a bit unecessary to keep some fields in WorkflowInput null.

0

There are 0 best solutions below