Why should the interface for a Java class be preferred?

后端 未结 10 1336
陌清茗
陌清茗 2020-11-22 05:43

PMD would report a violation for:

ArrayList list = new ArrayList();


The violation was \"Avoid using implementat

相关标签:
10条回答
  • 2020-11-22 06:16

    Using interfaces over concrete types is the key for good encapsulation and for loose coupling your code.

    It's even a good idea to follow this practice when writing your own APIs. If you do, you'll find later that it's easier to add unit tests to your code (using Mocking techniques), and to change the underlying implementation if needed in the future.

    Here's a good article on the subject.

    Hope it helps!

    0 讨论(0)
  • 2020-11-22 06:18

    Why should the latter with List be used instead of ArrayList?

    It's a good practice : Program to interface rather than implementation

    By replacing ArrayList with List, you can change List implementation in future as below depending on your business use case.

    List<Object> list = new  LinkedList<Object>(); 
    /* Doubly-linked list implementation of the List and Deque interfaces. 
     Implements all optional list operations, and permits all elements (including null).*/
    

    OR

    List<Object> list = new  CopyOnWriteArrayList<Object>(); 
    /* A thread-safe variant of ArrayList in which all mutative operations
     (add, set, and so on) are implemented by making a fresh copy of the underlying array.*/
    

    OR

    List<Object> list = new  Stack<Object>(); 
    
    /* The Stack class represents a last-in-first-out (LIFO) stack of objects.*/
    

    OR

    some other List specific implementation.

    List interface defines contract and specific implementation of List can be changed. In this way, interface and implementation are loosely coupled.

    Related SE question:

    What does it mean to "program to an interface"?

    0 讨论(0)
  • 2020-11-22 06:18

    In general for your line of code it does not make sense to bother with interfaces. But, if we are talking about APIs there is a really good reason. I got small class

    class Counter {
        static int sizeOf(List<?> items) {
            return items.size();
        }
    }
    

    In this case is usage of interface required. Because I want to count size of every possible implementation including my own custom. class MyList extends AbstractList<String>....

    0 讨论(0)
  • 2020-11-22 06:19

    Interface is exposed to the end user. One class can implement multiple interface. User who have expose to specific interface have access to some specific behavior which are defined in that particular interface.

    One interface also have multiple implementation. Based on the scenario system will work with different scenario (Implementation of the interface).

    let me know if you need more explanation.

    0 讨论(0)
  • 2020-11-22 06:26

    ArrayList and LinkedList are two implementations of a List, which is an ordered collection of items. Logic-wise it doesn't matter if you use an ArrayList or a LinkedList, so you shouldn't constrain the type to be that.

    This contrasts with say, Collection and List, which are different things (List implies sorting, Collection does not).

    0 讨论(0)
  • 2020-11-22 06:26

    Properties of your classes/interfaces should be exposed through interfaces because it gives your classes a contract of behavior to use, regardless of the implementation.

    However...

    In local variable declarations, it makes little sense to do this:

    public void someMethod() {
    List theList = new ArrayList();
    //do stuff with the list
    }
    

    If its a local variable, just use the type. It is still implicitly upcastable to its appropriate interface, and your methods should hopefully accept the interface types for its arguments, but for local variables, it makes total sense to use the implementation type as a container, just in case you do need the implementation-specific functionality.

    0 讨论(0)
提交回复
热议问题