访问java类方法的最佳方法是什么?
提前致谢!!
答案 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
的决定不仅取决于对象的创建及其费用您还需要考虑可用性。
如果可以为所有实例共享方法,并且不需要依赖任何对象属性,那么您可以愉快地将其设置为静态。
还需要考虑如何使用它。记住静态方法或字段不属于对象,它属于类