Java pytanie rekrutacyjne: Instancja klasy abstrakcyjnej

Czy można stworzyć instancję klasy abstrakcyjnej?

TL;DR

Nie można utworzyć instancji klasy abstrakcyjnej.

Można to już wywnioskosować z nazwy – abstrakcyjna. Można to również bez problemu sprawdzić:

package org.blog;

public abstract class Entity {
    private Long id;

    public Entity(Long id) {
        this.id = id;
    }

    public Long getId() {
        return id;
    }
}

Podczas próby utworzenia obiektu Entity:

package org.blog;

public class Main {

    public static void main(String[] args) {
        Entity entity = new Entity(1L);
    }
}

Otrzymamy błąd:

Error:(6, 25) java: org.blog.Entity is abstract; cannot be instantiated

Zalety

Klasy abstrakcyjne mają swoje zastosowanie pomimo tego, że w Javie zazwyczaj wykorzystujemy interfejsy do określania abstrakcji.

Wykorzystuj się je czesto do stworzenia „bazy” dla jakiegoś modelu, ponieważ większość modeli mają coś ze sobą wspólnego np. ID tak jak to widać to na przykładzie poniżej.

package org.blog;

public class User extends Entity {
    private String login;
    private String email;

    public User(Long id, String login, String email) {
        super(id);
        this.login = login;
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public String getEmail() {
        return email;
    }
}

Choć w niektórych serwisach też one mogą się przydać:

package org.blog;

public abstract class RemoteService {
    private final String url;

    public RemoteService(String url) {
        this.url = url;
    }

    public String getUrl() {
        return getBaseUrl() + "/" + url;
    }

    private String getBaseUrl() {
        //load base url from config file
    }
}

I na bazie klasy abstrakcyjnej możemy tworzyć kolejne serwisy, gdzie wszystkie będą bazować na tym samym base url zaciąganym z pliku konfiguracyjnego.

package org.blog;

import java.util.List;

public class FacebookUserService extends RemoteService{

    public FacebookUserService(String url) {
        super(url);
    }
    
    public List<User> getUsers() {
        // get users from facebook rest api
    }
}

Cały kod można zobaczyć tutaj.