Pattern, Abstract Factory / Factory

Rudi Araújo rudi.araujo at gmail.com
Sat Feb 6 20:24:57 UTC 2021


Also, a slightly Lispier way to do what you want:

List.of(Foo.class, Bar.class, Baz.class).stream().map(c -> {
    try {
        return c.newInstance();
    } catch(Exception e) {
        e.printStackTrace();
        return null;
    }
}).collect(Collectors.toList());

The Stream API and lambdas make it almost pleasant to work with Java, but
exception handling is still a bit tricky...

On Sat, 6 Feb 2021 at 21:06, Rudi Araújo <rudi.araujo at gmail.com> wrote:

> Class::newInstance() doesn't have any parameters (also, it's deprecated:
> better to use getConstructor() or getDeclaredConstructor() and call
> newInstance() on it).
>
> Also, the generic agreement on your calls to makeAndPrint is failing.
>
> This does what you wanted:
>
> jshell> class Foo { }
> |  modified class Foo
>
> jshell> class Bar extends Foo { }
> |  modified class Bar
>
> jshell> class Baz extends Foo { }
> |  modified class Baz
>
> jshell> class Main {
>    ...>   public static void main(String[] args) {
>    ...>     makeAndPrint(Foo.class);
>    ...>     makeAndPrint(Bar.class);
>    ...>     makeAndPrint(Baz.class);
>    ...>   }
>    ...>
>    ...>   public static void makeAndPrint(Class<? extends Foo> klass) {
>    ...>     try {
>    ...>       Object o = klass.newInstance();
>    ...>       System.out.println("Created: " + o.toString());
>    ...>     } catch (Exception e) {
>    ...>       System.err.println("Failed: " + klass);
>    ...>     }
>    ...>   }
>    ...> }
> |  created class Main
>
> jshell> Main.main(new String[]{})
> Created: REPL.$JShell$11$Foo at 6a4f787b
> Created: REPL.$JShell$12$Bar at 7d9d1a19
> Created: REPL.$JShell$13$Baz at 39c0f4a
>
>
> On Sat, 6 Feb 2021 at 20:56, Luís Oliveira <luismbo at gmail.com> wrote:
>
>> On Sat, 6 Feb 2021 at 16:29, Manfred Bergmann <manfred.bergmann at me.com>
>> wrote:
>> > But this is kind of also possible in i.e. Java where you can say:
>> > Foo.class.newInstance() which uses reflection and is not normally used.
>> > But is effectively similar to make-instance `foo.
>>
>>  My Java is getting rustier and rustier, but maybe you can tell me why
>> the following program doesn't compile:
>>
>> class Foo { }
>> class Bar extends Foo { }
>> class Baz extends Foo { }
>>
>> class Main {
>>   public static void main(String[] args) {
>>     makeAndPrint(Foo.class);
>>     makeAndPrint(Bar.class);
>>     makeAndPrint(Baz.class);
>>   }
>>
>>   public static void makeAndPrint(Class<Foo> klass) {
>>     try {
>>       Object o = klass.newInstance(klass);
>>       System.out.println("Created: " + o.toString());
>>     } catch (Exception e) {
>>       System.err.println("Failed: " + klass);
>>     }
>>   }
>> }
>>
>> The rough equivalent in Common Lisp would be:
>>
>> (defclass foo () ())
>> (defclass bar (foo) ())
>> (defclass baz (foo) ())
>>
>> (mapcar #'make-instance '(foo bar baz))
>>
>> Luís
>>
>>
>
> --
> He who binds to himself a joy
> Doth the winged life destroy
> But he who kisses the joy as it flies
> Lives in Eternitys sun rise
>
> - William Blake
>


-- 
He who binds to himself a joy
Doth the winged life destroy
But he who kisses the joy as it flies
Lives in Eternitys sun rise

- William Blake
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/pro/attachments/20210206/16d6bff4/attachment.html>


More information about the pro mailing list