When NOT to use the static keyword in Java?

后端 未结 9 771
轮回少年
轮回少年 2020-11-27 13:29

When is it considered poor practice to use the static keyword in Java on method signatures? If a method performs a function based upon some arguments, and does not require a

相关标签:
9条回答
  • 2020-11-27 14:01

    In general, I prefer instance methods for the following reasons:

    1. static methods make testing hard because they can't be replaced,
    2. static methods are more procedural oriented.

    In my opinion, static methods are OK for utility classes (like StringUtils) but I prefer to avoid using them as much as possible.

    0 讨论(0)
  • 2020-11-27 14:04

    Static methods are usually written for two purposes. The first purpose is to have some sort of global utility method, similar to the sort of functionality found in java.util.Collections. These static methods are generally harmless. The second purpose is to control object instantiation and limit access to resources (such as database connections) via various design patterns such as singletons and factories. These can, if poorly implemented, result in problems.

    For me, there are two downsides to using static methods:

    1. They make code less modular and harder to test / extend. Most answers already addressed this so I won't go into it any more.
    2. Static methods tend to result in some form of global state, which is frequently the cause of insidious bugs. This can occur in poorly written code that is written for the second purpose described above. Let me elaborate.

    For example, consider a project that requires logging certain events to a database, and relies on the database connection for other state as well. Assume that normally, the database connection is initialized first, and then the logging framework is configured to write certain log events to the database. Now assume that the developers decide to move from a hand-written database framework to an existing database framework, such as hibernate.

    However, this framework is likely to have its own logging configuration - and if it happens to be using the same logging framework as yours, then there is a good chance there will be various conflicts between the configurations. Suddenly, switching to a different database framework results in errors and failures in different parts of the system that are seemingly unrelated. The reason such failures can happen is because the logging configuration maintains global state accessed via static methods and variables, and various configuration properties can be overridden by different parts of the system.

    To get away from these problems, developers should avoid storing any state via static methods and variables. Instead, they should build clean APIs that let the users manage and isolate state as needed. BerkeleyDB is a good example here, encapsulating state via an Environment object instead of via static calls.

    0 讨论(0)
  • 2020-11-27 14:07

    when you want to use a class member independently of any object of that class,it should be declared static.
    If it is declared static it can be accessed without an existing instance of an object of the class. A static member is shared by all objects of that specific class.

    0 讨论(0)
  • 2020-11-27 14:15

    That's right. Indeed, you have to contort what might otherwise be a reasonable design (to have some functions not associated with a class) into Java terms. That's why you see catch-all classes such as FredsSwingUtils and YetAnotherIOUtils.

    0 讨论(0)
  • 2020-11-27 14:15

    Two questions here 1) A static method that creates objects stays loaded in memory when it is accessed the first time? Isnt this (remaining loaded in memory) a drawback? 2) One of the advantages of using Java is its garbage collection feature - arent we ignoring this when we use static methods?

    0 讨论(0)
  • 2020-11-27 14:16

    Two of the greatest evils you will ever encounter in large-scale Java applications are

    • Static methods, except those that are pure functions*
    • Mutable static fields

    These ruin the modularity, extensibility and testability of your code to a degree that I realize I cannot possibly hope to convince you of in this limited time and space.

    *A "pure function" is any method which does not modify any state and whose result depends on nothing but the parameters provided to it. So, for example, any function that performs I/O (directly or indirectly) is not a pure function, but Math.sqrt(), of course, is.

    More blahblah about pure functions (self-link) and why you want to stick to them.

    I strongly encourage you to favor the "dependency injection" style of programming, possibly supported by a framework such as Spring or Guice (disclaimer: I am co-author of the latter). If you do this right, you will essentially never need mutable static state or non-pure static methods.

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