java 中执行以下任务的最佳方法是什么
Which is the best way to do the following task in java
我的应用中常用的方法有20多个。我想将这 20 种方法移动到一个通用的 class.
我的疑问是,将所有方法定义为静态或普通方法,并创建一个全局对象来访问普通方法。
class Common {
public String method1() {........}
public String method2() {........}
public String method3() {........}
public String method4() {........}
public String method5() {........}
...
}
正在创建对象。
class CommonService {
private static Common common;
public static Common getCommon() {
if(null == common) {
common = new common();
}
return common;
}
}
如果我们使用静态方式创建所有方法,则所有 20 个方法都存储在堆的 PermGen 部分。
但是如果按照上面的方法,只能创建一个对象并存储在java堆中。
请说明哪种方法最好。
"Common functions" 不太准确。这真的取决于你想做什么,例如,当我制作一些字符串实用程序时,我制作了 StringUtils class 并且它有我需要的东西。是否使其静态取决于要处理的数据,如果一个信息可能会多次用于调用那么答案很简单 - 使用实例。
你应该从设计的角度考虑一下"best"的方式。
如果这些方法用于一般用途,则最好将它们设为 static
,因为您将没有任何状态可存储,而且您将 节省内存这样。
在决定是否要在实用程序 class 中使用 static
方法之前,您应该考虑其他事项。一方面,实用程序 class 将非常容易测试,而且非常容易访问。另一方面,很难在测试中模拟 static
方法。
如果我有一个实用程序class,我会这样写:
public final class Common {
private Common() { }
public static int method1() { }
public static int method2() { }
// ...
}
这取决于方法的作用。
如果这些方法只是辅助方法,不会改变状态,那么 static
可能更好,因为这样您就不必在每次要使用其中一种方法时都创建一个对象。你可以打电话给 Common.method()
但是,如果对象有状态,那么您应该评估使用对象的方法,并在需要使用这些方法时创建一个新对象。
希望对您有所帮助。
If we create all the methods using static means, all 20 methods are stored in PermGen section of the heap.
方法不是数据,而是代码。存储代码的位置不取决于方法是否接受隐式 this
参数。如果使用单例方式,方法代码仍然会占用存储空间,并且堆上还会有一个实例。
但是,以上所有内容都是无关紧要的,您关注的是设计中完全错误的方面。重要的是决定将如何影响使用这些方法的代码:
- 静态方法很简单,是纯函数(不依赖于任何外部状态)的绝佳选择;
- 单例允许多态性,因此使方法更容易模拟以进行测试。
如果此方法的意义是 "execute pure function",如数学 sin(x)、cos(x) 等静态方法是最好的。
它们属于一个域? (主题范围)还是不同? (然后用正确的名称创建更多 "utility classes")
如果有状态(就像很多人说的那样)也许最好是单例。
问题的形状 "i have 20 method in application" 和名称 Common 建议以前的(较旧的)设计问题,我说 "procedural thinking",OOP 的视力不佳。
没有代码很难说。
我的应用中常用的方法有20多个。我想将这 20 种方法移动到一个通用的 class.
我的疑问是,将所有方法定义为静态或普通方法,并创建一个全局对象来访问普通方法。
class Common {
public String method1() {........}
public String method2() {........}
public String method3() {........}
public String method4() {........}
public String method5() {........}
...
}
正在创建对象。
class CommonService {
private static Common common;
public static Common getCommon() {
if(null == common) {
common = new common();
}
return common;
}
}
如果我们使用静态方式创建所有方法,则所有 20 个方法都存储在堆的 PermGen 部分。
但是如果按照上面的方法,只能创建一个对象并存储在java堆中。
请说明哪种方法最好。
"Common functions" 不太准确。这真的取决于你想做什么,例如,当我制作一些字符串实用程序时,我制作了 StringUtils class 并且它有我需要的东西。是否使其静态取决于要处理的数据,如果一个信息可能会多次用于调用那么答案很简单 - 使用实例。
你应该从设计的角度考虑一下"best"的方式。
如果这些方法用于一般用途,则最好将它们设为 static
,因为您将没有任何状态可存储,而且您将 节省内存这样。
在决定是否要在实用程序 class 中使用 static
方法之前,您应该考虑其他事项。一方面,实用程序 class 将非常容易测试,而且非常容易访问。另一方面,很难在测试中模拟 static
方法。
如果我有一个实用程序class,我会这样写:
public final class Common {
private Common() { }
public static int method1() { }
public static int method2() { }
// ...
}
这取决于方法的作用。
如果这些方法只是辅助方法,不会改变状态,那么 static
可能更好,因为这样您就不必在每次要使用其中一种方法时都创建一个对象。你可以打电话给 Common.method()
但是,如果对象有状态,那么您应该评估使用对象的方法,并在需要使用这些方法时创建一个新对象。
希望对您有所帮助。
If we create all the methods using static means, all 20 methods are stored in PermGen section of the heap.
方法不是数据,而是代码。存储代码的位置不取决于方法是否接受隐式 this
参数。如果使用单例方式,方法代码仍然会占用存储空间,并且堆上还会有一个实例。
但是,以上所有内容都是无关紧要的,您关注的是设计中完全错误的方面。重要的是决定将如何影响使用这些方法的代码:
- 静态方法很简单,是纯函数(不依赖于任何外部状态)的绝佳选择;
- 单例允许多态性,因此使方法更容易模拟以进行测试。
如果此方法的意义是 "execute pure function",如数学 sin(x)、cos(x) 等静态方法是最好的。
它们属于一个域? (主题范围)还是不同? (然后用正确的名称创建更多 "utility classes")
如果有状态(就像很多人说的那样)也许最好是单例。
问题的形状 "i have 20 method in application" 和名称 Common 建议以前的(较旧的)设计问题,我说 "procedural thinking",OOP 的视力不佳。
没有代码很难说。