开发者

why attribute from interface is declared in classes

开发者 https://www.devze.com 2023-02-09 09:01 出处:网络
I have seen that if I have interface named interfaceABC. Example: public class ABController extends AbstractCO开发者_JS百科ntroller {

I have seen that if I have interface named interfaceABC.

Example:

public class ABController extends AbstractCO开发者_JS百科ntroller {


private interfaceABC inter;

I am confused that why we make object from interface not from class that implemented it.


private interfaceABC inter;

i am confused that why we make object from interface not from class that implemented it

We haven't created an object/instance yet. We simply declared a variable to hold it. We don't make objects from interfaces (you have to use a concrete class to do that), but we will often use interface types instead of the actual concrete class for variable declarations, method parameter types, and method return types.

Take this for exmaple:

List<Example> examples = new ArrayList<Example>();
...
public List<Example> getExamples() { return examples; }

Using the interface List here instead of the concrete class ArrayList follows a common best practice: to use interfaces instead of concrete classes whenever possible, e.g. in variable declarations, parameters types, and method return types. The reason this is considered a best practice is:

  1. Using the interface for declarations and for return types hides an implementation detail, making it easier to modify in the future. For example, we may find that the code works better using a LinkedList rather than ArrayList. We can easily make this change in one place now, just where the list is instantiated. This practice is especially key for method parameter types and method return types, so that external users of the class won't see this implementation detail of your class and are free to change it without affecting their code.

  2. By using the interface, it may be clearer to a future maintainer that this class needs some kind of List, but it does not specifically need an ArrayList. If this class relied on some ArrayList-specific property, i.e. it needs to use an ArrayList method, than using ArrayList<Example> examples = ... instead of List<Example> examples = ... may be a hint that this code relies on something specific to an ArrayList.

  3. It may simplify testing/mocking to use the more abstract List than to use the concrete class ArrayList.


We haven't made an object, we've made a reference.

By using a reference to the interface rather than a concrete class, we are free to swap in a different implementation of the interface, with no changes to this code. This improves encapsulation, and also facilitates e.g. testing (because we can use mock objects). See also dependency injection.


This is actually very useful. Take the example that we're using a list.

public class A {
    private List<String> list;

    public A(List<String> list) {
        this.list = list;
    } 

}

This allows class A to work with all operations defined by the list interface. The class constructing A can now give any implementation without changing the code of class A, hence promoting encapsulation, code reuse, testing etc. For instance:

new A(new ArrayList<String>());


For a private field, it does not really matter too much, as that's an implementation detail anyway. Many people will still on principle use the interface everywhere they can.

On the other hand, protected fields (and of course the parameters of public methods) form an API that becomes much more flexible by using interfaces, because that allows subclasses/clients to choose which implementation class they want to use, even classes they supply themselves and which didn't even exist when the API was created.

Of course, if you have a public set method or constructor that sets the private field, then you have to use the interface type for the field as well.


Imagine a gift-wrapping stall in a shop that has a machine which will wrap any box.

The machine is simply designed and built to wrap a rectangular box, it shouldn't matter whether there's chocolate in the box or a toy car. If it mattered, the machine would quite obviously be flawed.

But even before you get to that stall, you have to buy that gift: so the cashier scans the barcode first. The barcode scanner is another example of the same principle: it will scan anything as long as it has a recognisable barcode on it. A barcode scanner that only scanned newspapers would be useless.

These observations led to the concept of encapsulation in software design, which you can see in action when a class refers to an object by an interface only, and not its concrete class.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号