访问java类方法的最佳方法是创建对象或创建方法静态类型?

时间:2015-04-20 06:16:05

标签: java object static-methods

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

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

5 个答案:

答案 0 :(得分:2)

你想要一个对于所有类实例使用静态应该是常量的行为,这是一个很好的做法可以节省内存。

如果希望方法行为更改每个类的实例,请使用非静态方法。

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

使用任何订单返回标准包装成本的方法应该是静态的。不依赖于类属性的方法应该是静态的。

而根据所选菜单返回订单成本的方法应该是非静态的。

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

答案 1 :(得分:1)

对象确实更贵,但出于维护原因,它通常是值得的: 您的类封装了传递给静态方法的繁琐数据。例如。如果'login'方法需要从MySQL数据库查找用户数据& Mongo - 然后将DB连接传递给每个调用是很繁琐的:

   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),并根据一些管理切换它们命令,甚至仅用于测试。这归结为具有不同实现类的接口,每个类都封装了所需的帮助程序:

       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
              ...  
}

另请注意:对垃圾收集的影响可能不是那么糟糕(取决于您的需求,您的实时时间是多少)。某些对象可能会被缓存并重新使用。一些对象被如此简单地使用,以至于它们仍处于“婴儿”代中,GC处理得相当好

答案 2 :(得分:0)

这完全取决于方法的行为是针对一个类的实例,还是针对每个可能的实例。

我们并不总是使用静态,因为我们不时会期望对象做出不同的反应。 比方说,我们有一个Person类,有两个“实例”,你和我。 如果我们要实现一个方法:

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

我们中的一个人必须改变他的名字。为此,您希望每个Person实例都有不同的回复,因此静态不适合此处。

在这里,您需要两个实例,一个实例变量名称(由构造函数或mutator设置),对我来说,它将返回“Hans”,并且您将返回“Pushpendra”

答案 3 :(得分:0)

  

静态方法属于该类   并且非静态方法属于   一个阶级的对象。这是一个   非静态方法只能被调用   在一个类的对象上它   属于。静态方法可以   然而,在课堂上被称为   以及作为班级的对象。一个   静态方法只能访问静态   成员。非静态方法可以   访问静态和非静态   因为在当时的成员   调用静态方法,类   可能没有实例化(如果是的话)   呼唤班级本身)。在里面   其他情况下,非静态方法即可   只有在班级有人时才会被召唤   已经实例化了。静止的   方法由所有实例共享   上课。

我有来自here的数据。

答案 4 :(得分:0)

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

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

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

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