theSecretCoder
theSecretCoder

Reputation: 713

If all these 3 classes are following SOLID concept

I want to ask you something more on this matter for the below code for SOLID. If all these 3 classes are are following SOLID concept.

public interface A {
    public void calculate(String a);
}

public class B implements A {
    @Override
    public void calculate(String b) {
        System.out.println("value: " + b);
    }
}

public class C {

    private A a;

    public void show() {
        a = new B();
        a.calculate("test");
    }

}

Upvotes: 4

Views: 128

Answers (2)

theSecretCoder
theSecretCoder

Reputation: 713

I hope the below code snippet is following SOLID strongly.

public class Creator {

public static A getA(){
    A a = new B();
    return a;
}
}

public class C {

private A a;

public void show() {
    setB();
    a.calculate("test");
}

private void setB(){
        a = Creator.getA();
}

}

Upvotes: 0

Can't Tell
Can't Tell

Reputation: 13466

From how I look at things,

Class C breaks the

Single Responsibility Principle by handling two responsibilities, namely, instantiating other objects(instance of B) and the show functionality whatever that is. Object creation should be handled by a separate class and the dependencies should be injected to the users.

Open Closed Principle by being tightly coupled to B, whereas it could have depended on the interface A, thus being open for extension by using another implementation of A. See this for more information. In other words, C should have used A, and the actual implementation should have been injected to C.

Following is how you could write C to be SOLID.

class C {
    private A a;

    public C(A a) {
        super();
        this.a = a;
    }

    public void show() {
        a.calculate("test");
    }

}

class Creator {
    C createC() {
        A b = new B();
        return new C(b);
    }
}

Creator could be replaced by a dependency injection framework like Spring.

Upvotes: 4

Related Questions