protected = nicht protected?

Bitte aktiviere JavaScript!
In meinem Projekt habe ich keine Klasse für Kontakte:
Code:
@Entity
@Table(name = "contacts")
public abstract class Contact {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        
        @NotNull
        @CreationTimestamp
        private LocalDateTime created_at;
        
        @NotNull
        @OneToOne(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER)
        @JoinColumn(name="created_by")       
        private Person    created_by;
        
        @UpdateTimestamp
        private LocalDateTime updated_at;
        
        @OneToOne(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER)   
        @JoinColumn(name="updated_by")       
        private Person    updated_by;   
        
        @Enumerated
        @Column(columnDefinition = "smallint")
        private EContactMethod method = EContactMethod.TELEPHON;
        
        @Enumerated
        @Column(columnDefinition = "smallint")   
        private EContactLocation location = EContactLocation.BUSINESS;
        
        @NotBlank
        @Column(length = 255)
        private String content;
        
        @OneToOne(cascade = CascadeType.REMOVE, fetch=FetchType.EAGER)
        @JoinColumn(name="address_id")   
        private Address address;
        
        @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
        @JoinTable(
                name = "contact_infos",
                joinColumns={ @JoinColumn(name="contact_id", referencedColumnName="id") },
                inverseJoinColumns={ @JoinColumn(name="text_id", referencedColumnName="id", unique=true) }
        )
        private List<Text> infos = new ArrayList<Text>();
        
        public Contact() {
        }

        public Contact(Contact contact) {
            
            this.method = contact.method;
            this.location = contact.location;
            this.content = contact.content;
            this.address = contact.address;
            
            List<String> strings = new ArrayList<>();
            contact.infos.stream().forEach((info) -> {
                this.infos.add(new Text(info));
            });
        }
        
        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }
        
        public LocalDateTime getCreatedAt() {
            return created_at;
        }
        
        public void setCreatedAt(LocalDateTime created_at) {
            this.created_at = created_at;
        }
        
        public Person getCreatedBy() {
            return created_by;
        }
        
        public void setCreatedBy(Person created_by) {
            this.created_by = created_by;
        }
        
        public LocalDateTime getUpdatedAt() {
            return updated_at;
        }
        
        public void setUpdatedAt(LocalDateTime updated_at) {
            this.updated_at = updated_at;
        }
        
        public Person getUpdatedBy() {
            return updated_by;
        }
        
        public void setUpdatedBy(Person updated_by) {
            this.updated_by = updated_by;
        }
        
        public EContactMethod getMethod() {
            return method;
        }
        
        protected void setMethod(EContactMethod method) {
            this.method = method;
        }
            
        public EContactLocation getLocation() {
            return location;
        }
        
        public void setLocation(EContactLocation location) {
            this.location = location;
        }
        
        protected String getContent() {
            return content;
        }
        
        protected void setContent(String content) {
            this.content = content;
        }
        
        protected Address getAddress() {
            return address;
        }
        
        protected void setAddress(Address address) {
            this.address = address;
        }
        
        public List<Text> getInfos() {
            return infos;
        }
        
        public void setInfos(List<Text> infos) {
            this.infos = infos;
        }
        
        @Override
        public String toString() {
            return "Contact [id=" + id + ", created_at=" + created_at + ", created_by=" + created_by + ", updated_at="
                    + updated_at + ", updated_by=" + updated_by + ", method=" + method + ", location=" + location
                    + ", content=" + content + ", address=" + address + ", infos=" + infos + "]";
        }
}
Dieses ist eine Abstrakte Klasse, weil es für jeden EContactMethod (TELEPHON, ADDRESS, EMAIL, INTERNET, ...) wird es eine eigene Klasse geben wird.

Für meine Basisklasse Contact habe ich eine Testklasse
Code:
class ContactTestClass extends Contact {

    public ContactTestClass() {
        super();
    }

    public ContactTestClass(Contact contact) {
        super(contact);
    }
    
}

public class ContactTest {
        private Validator validator;
        
        @Before
        public void setUp() throws Exception {
            ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
            validator = factory.getValidator();
        }

        @Test
        public void testCopyConstructor() {
            EContactMethod methodValue = EContactMethod.TELEPHON;
            EContactLocation locationValue = EContactLocation.BUSINESS;
            String contentValue = "content";
            Address addressValue = new Address();
            String info1Value = "german text";
            String info2Value = "english text";
            String info3Value = "netherlands text";
            
            List<Text> infoValue = new ArrayList<Text>();
            infoValue.add(new Text(new Language(), info1Value));
            infoValue.add(new Text(new Language(), info2Value));
            infoValue.add(new Text(new Language(), info3Value));
            
            ContactTestClass contact = new ContactTestClass();
            contact.setMethod(methodValue);
            contact.setLocation(locationValue);
            contact.setContent(contentValue);
            contact.setAddress(addressValue);
            contact.setInfos(infoValue);
            
            ContactTestClass copied_contact = new ContactTestClass(contact);

            assertEquals(copied_contact.getMethod(), methodValue);
            assertEquals(copied_contact.getLocation(), locationValue);
            assertEquals(copied_contact.getContent(), contentValue);
            assertEquals(copied_contact.getAddress(), addressValue);
            assertEquals(copied_contact.getInfos().size(), 3);
            assertNotEquals(copied_contact.getInfos().get(0), contact.getInfos().get(0));
            assertEquals(copied_contact.getInfos().get(0).getText(), info1Value);
            assertNotEquals(copied_contact.getInfos().get(1), contact.getInfos().get(1));
            assertEquals(copied_contact.getInfos().get(1).getText(), info2Value);
            assertNotEquals(copied_contact.getInfos().get(2), contact.getInfos().get(2));
            assertEquals(copied_contact.getInfos().get(2).getText(), info3Value);
        }
        
        ...
}
Im der Test-Datei befindet sich eine konkrete Klasse ContactTestClass.

Nun hätte ich gedacht das man auf die protected Methode setMethod() von der Test Klasse nicht zugreifen können. Also die Test Funktion hätte nicht funktionieren können, weil es in der ContactTestClass nicht überschrieben wird.

Aber es scheint zu funkionieren. Weis jemand warum?
 
Auf protected-Variablen und -Methoden kannst Du in abgleiteten Klassen zugreifen (das ist der Unterschied zu private).

Also die Test Funktion hätte nicht funktionieren können, weil es in der ContactTestClass nicht überschrieben wird.
Wenn eine Methode nicht überschrieben wird, wird die Methode der Basisklasse verwendet.
 
Sind die Klassen zufällig im selben Package?
Nein die eine befindet sich im src/main/com/project/entities also in der Namespace com.project.entities
und die andere im Test verzeichnis src/test/com/project/entities

Auf protected-Variablen und -Methoden kannst Du in abgleiteten Klassen zugreifen (das ist der Unterschied zu private).

Wenn eine Methode nicht überschrieben wird, wird die Methode der Basisklasse verwendet.
Das wäre logisch, wenn es eine abgeleitet Klasse ist. Aber die abgeleitete Klasse heißt ContactTestClass und die Test Klasse
ContactTest. s.o.
 
Ja aber außerhalb eine Klasse sollte man doch eigentlich nicht auf eine protected Methode von einer anderen Klasse aus zugreifen können! Weil sonst könnte ich ja auch im Source - Pfad in der gleich package eine Klasse XYZ erstellen die auf die protected Funktion der obigen Klasse zugreifen und das ist eigentlich nicht Sinn und Zweck von protected.
 
Ja aber außerhalb eine Klasse sollte man doch eigentlich nicht auf eine protected Methode von einer anderen Klasse aus zugreifen können!
Das wäre dann private.

Weil sonst könnte ich ja auch im Source - Pfad in der gleich package eine Klasse XYZ erstellen die auf die die protected Funktion der obigen Klasse zugreift und das ist eigentlich nicht Sinn und Zweck von protected.
Über Sinn und Unsinn lässt sich streiten. So lange das System logisch bleibt, kann man definieren was man will. Und Java spezifiziert protected nun einmal so, dass es eine Ordnung bzgl. der Restriktionen der Modifizierer gibt: private, package private, protected, public.

Genauso legitim wäre es, protected in Deinem Sinn zu verstehen. Allerdings wird es dann schwierig, zwischen den Modifizierern eine Ordnung anzugeben, denn die Frage, ob "package private" oder "protected" restriktiver wäre, ließe sich dann nicht mehr einfach beantworten.

Das ist nur meine persönliche Sicht der Dinge.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben