0

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.

ababuji
  • 1,683
  • 2
  • 14
  • 39
  • `domain == "foo"` - you should use `"foo".equals(domain)` instead. See https://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java/513935#513935 – Thomas Timbul Dec 14 '22 at 20:47
  • 1
    Have another read of https://www.baeldung.com/java-factory-pattern-generics and note how the Class is passed in as a parameter, not a String. == comparison is acceptable for a Class type. Then, the requestor (user of the factory) should know whether it has `BarInput` or `FooInput` available and request from the factory a suitable `ArtifactCreator` for that input. – Thomas Timbul Dec 14 '22 at 20:52

0 Answers0