Java 8 Supplier with arguments in the constructor

后端 未结 8 1988
小蘑菇
小蘑菇 2020-12-01 00:07

Why do suppliers only support no-arg constructors?

If the default constructor is present, I can do this:

create(Foo::new)

But if th

8条回答
  •  我在风中等你
    2020-12-01 00:21

    Pair the Supplier with a FunctionalInterface.

    Here's some sample code I put together to demonstrate "binding" a constructor reference to a specific constructor with Function and also different ways of defining and invoking the "factory" constructor references.

    import java.io.Serializable;
    import java.util.Date;
    
    import org.junit.Test;
    
    public class FunctionalInterfaceConstructor {
    
        @Test
        public void testVarFactory() throws Exception {
            DateVar dateVar = makeVar("D", "Date", DateVar::new);
            dateVar.setValue(new Date());
            System.out.println(dateVar);
    
            DateVar dateTypedVar = makeTypedVar("D", "Date", new Date(), DateVar::new);
            System.out.println(dateTypedVar);
    
            TypedVarFactory dateTypedFactory = DateVar::new;
            System.out.println(dateTypedFactory.apply("D", "Date", new Date()));
    
            BooleanVar booleanVar = makeVar("B", "Boolean", BooleanVar::new);
            booleanVar.setValue(true);
            System.out.println(booleanVar);
    
            BooleanVar booleanTypedVar = makeTypedVar("B", "Boolean", true, BooleanVar::new);
            System.out.println(booleanTypedVar);
    
            TypedVarFactory booleanTypedFactory = BooleanVar::new;
            System.out.println(booleanTypedFactory.apply("B", "Boolean", true));
        }
    
        private , T extends Serializable> V makeVar(final String name, final String displayName,
                final VarFactory varFactory) {
            V var = varFactory.apply(name, displayName);
            return var;
        }
    
        private , T extends Serializable> V makeTypedVar(final String name, final String displayName, final T value,
                final TypedVarFactory varFactory) {
            V var = varFactory.apply(name, displayName, value);
            return var;
        }
    
        @FunctionalInterface
        static interface VarFactory {
            // Don't need type variables for name and displayName because they are always String
            R apply(String name, String displayName);
        }
    
        @FunctionalInterface
        static interface TypedVarFactory> {
            R apply(String name, String displayName, T value);
        }
    
        static class Var {
            private String name;
            private String displayName;
            private T value;
    
            public Var(final String name, final String displayName) {
                this.name = name;
                this.displayName = displayName;
            }
    
            public Var(final String name, final String displayName, final T value) {
                this(name, displayName);
                this.value = value;
            }
    
            public void setValue(final T value) {
                this.value = value;
            }
    
            @Override
            public String toString() {
                return String.format("%s[name=%s, displayName=%s, value=%s]", getClass().getSimpleName(), this.name, this.displayName,
                        this.value);
            }
        }
    
        static class DateVar extends Var {
            public DateVar(final String name, final String displayName) {
                super(name, displayName);
            }
    
            public DateVar(final String name, final String displayName, final Date value) {
                super(name, displayName, value);
            }
        }
    
        static class BooleanVar extends Var {
            public BooleanVar(final String name, final String displayName) {
                super(name, displayName);
            }
    
            public BooleanVar(final String name, final String displayName, final Boolean value) {
                super(name, displayName, value);
            }
        }
    }
    

提交回复
热议问题