Sichtbarkeit bei Supplier

M

Mart

Gast
Also ich habe eine builder Funktion die Einen Supplier von einer klasse annimmt und dann .get() aufruft um eine Neue instanz zu bekommen
diese liegt in einem ganz anderen package

jetzt hab ich rum probiert und verstehe nicht warum ich hier den bob überhaupt bauen darf, warum darf das andere package wissen dass die klasse überhaupt existiert ?
Java:
class tes
{
    public static void main(String[] args)
    {
        System.out.println(RapidFX.build(bob::new)
            .with(bob::setName, "bobby")
            .build().getName());
    }
    private static class bob{
        String name;
        public bob() {
        
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
    }
}

PS funktioinert auch wenn die Pakete in verschiedenen projekten liegen aber warum nur...?
PS2 warum gehts auch wenn ich den konstruktor auf private setz?
 

Robert Zenz

Top Contributor
Ausschlaggebend ist nicht das Paket aus welchen die (verwendende) Klasse kommt, sondern in welchem Paket du dich gerade befindest. Innerhalb einer Klasse darf man ueberall hingreifen, auf auf private Felder von Inner-Klassen.
 
M

Mart

Gast
wenn ich den bob auslagere in eine eigene klasse gibt es eine Möglichkeit dass nur tes den bob erzeugen darf und der bob konstruktor auf private ist?
 

Robert Zenz

Top Contributor
Nur eine bestimmte Klasse nicht, nein. package-private geht natuerlich, dann koennen es alle im gleichen Paket, aber das ist der Teufel.
 

Robert Zenz

Top Contributor
Eventuell waere ein besserer Ansatz die Facotyr-Methode in der jeweiligen Klasse zu stellen?

Java:
public class Bob {
    protected Bob() {
    }

    public static final WhateverYourBuilderIs<Bob> builder() {
        return RapidFX.build(Bob::new);
    }
}
 
M

Mart

Gast
Eventuell waere ein besserer Ansatz die Facotyr-Methode in der jeweiligen Klasse zu stellen?

Java:
public class Bob {
    protected Bob() {
    }

    public static final WhateverYourBuilderIs<Bob> builder() {
        return RapidFX.build(Bob::new);
    }
}
mnja das macht sinn


kann man mit KLasse::Attributname auch werte setzen? also dass mein supplier mit attributen funktioinert
 
M

Mart

Gast
Java:
class tes
{
    public static void main(String[] args)
    {
        System.out.println(bob.builder());
    }
    private static class bob{
        String name;
        public static final bob builder() {
            return RapidFX.build(bob::new)
                    .with(bob::setName, "bobby")
                    .build();
        }
        protected bob() {
          
        }
        protected void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
    }
}
zb dass ich hier das setName nicht mehr brauche ? gut es wäre dann möglich einen laufzeit felher in der Set name zu werfen falls dämliche sachen übergeben worden sind
 
M

Mart

Gast
Java:
public class test
{
    public static void main(String[] args)
    {
        System.out.println(bob.builder()
                .with(bob::setName, "bobby"));
    }
}
Java:
public class bob{
        String name;
        public static final GenericBuilder<bob> builder() {
            return RapidFX.build(bob::new);
        }
        protected bob() {
          
        }
        protected void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
    }
so zb hätte ich die möglichkeit immutable objekte zu erzeugen mit meinem builder
 

Ähnliche Java Themen

Neue Themen


Oben