访问 java class 方法的最佳方法是创建对象还是将方法设为静态类型?

Best way for accessing methods of java class is creating objects or make a method Static type?

访问 java class 方法的最佳方式是什么?

  1. 创建对象 - 如果我们每次都创建对象,那么它会消耗大量内存。
  2. 如果创建对象很昂贵,那么为什么我们不总是使用静态方法来访问 java class 的资源?

提前致谢!!

这完全取决于该方法的行为是针对 class 的一个实例还是针对所有可能的实例。

我们并不总是使用静态,因为有时我们希望对象有不同的反应。 比方说,我们有一个人 class,有两个 "instances",你和我。 如果我们要实现一个方法:

public static String getName(){ ....
}

我们中的一个人将不得不更改他的名字。为此,您希望每个 Person 实例都有不同的回复,因此 static 在这里不合适。

在这里,你需要两个实例,一个实例变量名(由构造函数或修改器设置),对我来说 return "Hans",对你来说 return "Pushpendra"

A static method belongs to the class and a non-static method belongs to an object of a class. That is, a non-static method can only be called on an object of a class that it belongs to. A static method can however be called both on the class as well as an object of the class. A static method can access only static members. A non-static method can access both static and non-static members because at the time when the static method is called, the class might not be instantiated (if it is called on the class itself). In the other case, a non-static method can only be called when the class has already been instantiated. A static method is shared by all instances of the class.

我有来自 here 的数据。

最好的方法!!?
没有任何最好的方法。根据您的目的,所有方法都是有用和好的。

制作方法的决定 static 不仅取决于对象的创建及其开销 你还需要考虑可用性。

如果一个方法可以为所有实例共享并且不需要依赖任何对象属性那么您可以愉快地将其设为静态。

还需要考虑你将如何使用它。请记住静态方法或字段不属于对象,它属于 class

您想要一个对于 class 使用静态的所有实例都应该保持不变的行为,这是一种节省内存的好习惯。

如果您希望方法行为随 class 的每个实例而改变,请使用非静态方法。

假设您有一个建立客户订单的程序。

一种方法,returns任何订单的标准包装成本应该是静态的。不依赖于 class 属性的方法应该是静态的。

而 returns 订单成本取决于所选菜单的方法应该是非静态的。

静态方法过多也会增加 class 加载时间。 静态方法无法被覆盖,因此您无法利用多态性的力量。通常静态方法用作实用程序 classes,如 Math.double() Math.float()

对象确实更贵,但出于维护原因通常是值得的: 您的 class 封装了传递给静态方法会很乏味的数据。例如。如果 'login' 方法需要从 MySQL 数据库和 Mongo 中查找用户数据 - 那么将数据库连接传递给每个调用是很乏味的:

   public class LoginService{
          public static login(String user,String password, DataSource mySQLConnections, MongoClient mongoClient) ... 

这个签名很难读,更糟糕的是:它对多态性不灵活。如果我们曾经将用户数据从 mySQL+mongo 迁移到 LDAP,那么我们需要修复对 "login(user,password, LDAPClient)"

的每次调用

现在,您可能仍然认为这可以静态解决:

   public class LoginService{
          private static DataSource mySQLConnections;
          private static MongoClient mongoClient;
          public static login(String user,String password) ... 

   // and if we ever migrate to LDAP, we just change the internal statics, without affecting the public signature:
   public class LoginService{
          private static LDDAPClient;
          public static login(String user,String password) ... 

有时这就足够了,但许多程序员仍然觉得它有局限性。有关详细信息,请阅读 Spring 和 "Dependency Injection",但最重要的是 - 我可能想使用 LoginService,有几个实例(一个使用 LDAP,另一个使用 MySQL+Mongo),并根据一些管理命令切换它们,甚至只是为了测试。这归结为具有不同实现 classes 的接口,每个都封装了其所需的助手:

       public interface LoginService{
              public login(String user,String password) ... 
       }
       public class LoginServiceDb implements LoginService{
              private DataSource mySqlConnections;
              private MongoClient mongoClient;
              public login(String user,String password) 
                    // use the databases
              ...
       }
       public class LoginServiceLDAP implements LoginService{
              private LDAPClient ldap;
              public login(String user,String password) 
                // use LDAP
              ...  
}

另请注意: 对垃圾收集的影响可能不会那么糟糕(取决于您的需要和您的程度 'real time')。某些对象可能会被缓存并重新使用。某些对象的使用时间如此之短,以至于它们保留在 GC 处理得相当好的 "infant" 代中