KP6*_*P65 868 java static-methods
我想知道何时使用静态方法?假设我有一个带有几个getter和setter的类,一个或两个方法,我希望这些方法只能在类的实例对象上调用.这是否意味着我应该使用静态方法?
例如
Obj x = new Obj();
x.someMethod
Run Code Online (Sandbox Code Playgroud)
要么
Obj.someMethod
Run Code Online (Sandbox Code Playgroud)
(这是静态方式吗?)
我很困惑!
not*_*eti 1397
一个经验法则:问问自己"即使没有构建Obj,这个方法也有意义吗?" 如果是这样,那肯定是静态的.
所以在一个类中Car你可能有一个double convertMpgToKpl(double mpg)静态的方法,因为人们可能想知道35mpg转换成什么,即使没有人建造过汽车.但是void setMileage(double mpg)(设置一个特定Car的效率)不能是静态的,因为在构建任何Car之前调用该方法是不可思议的.
(顺便说一下,反过来并不总是这样:你有时可能有一个涉及两个Car对象的方法,但仍然希望它是静态的.例如Car theMoreEfficientOf( Car c1, Car c2 ).虽然这可以转换为非静态版本,但有些人会认为,因为那里不是一个"特权"选择,其中Car更重要,你不应该强迫调用者选择一个Car作为你将调用方法的对象.这种情况只占所有静态方法的一小部分,虽然.)
小智 515
仅在以下方案中定义静态方法:
tet*_*suo 168
使用静态方法有一些正当理由:
性能:如果您希望运行某些代码,并且不希望实例化额外的对象,请将其推送到静态方法中.JVM也可以优化静态方法(我想我曾经读过James Gosling声明你不需要JVM中的自定义指令,因为静态方法会同样快,但找不到源 - 因此它可能是完全错误的).是的,它是微优化,可能不需要.而且我们程序员从不做不需要的东西只是因为它们很酷,对吧?
实用性:而不是呼叫new Util().method(arg),呼叫Util.method(arg)或method(arg)静态导入.更简单,更短.
添加方法:你真的希望类String有一个removeSpecialChars()实例方法,但它不存在(它不应该,因为你的项目的特殊字符可能与其他项目不同),你不能添加它(因为Java)有点理智,所以你创建一个实用程序类,而removeSpecialChars(s)不是调用s.removeSpecialChars().甜.
纯度:采取一些预防措施,你的静态方法将是一个纯函数,也就是说,它唯一依赖的是它的参数.数据输入,数据输出.这更容易阅读和调试,因为您没有担心继承怪癖.您也可以使用实例方法来完成它,但编译器将使用静态方法帮助您(通过不允许引用实例属性,重写方法等).
如果你想制作单身,你还必须创建一个静态方法,但是......不要.我的意思是,三思而后行.
现在,更重要的是,为什么你不想创建静态方法?基本上,多态性不在话下.您将无法覆盖该方法,也无法在接口中声明它 (Java 8之前的版本).它从您的设计中获得了很大的灵活性.此外,如果你需要状态,如果你不小心,你最终会遇到很多并发错误和/或瓶颈.
Alf*_*red 40
在阅读了Misko的文章后,我认为从测试的角度看静态方法是不好的.你应该有工厂(可能使用像Guice这样的依赖注入工具).
只有一个东西"如何确保我只有一个东西"的问题很好地回避了.您只在main中实例化一个ApplicationFactory,因此,您只实例化所有单例的单个实例.
静态方法的基本问题是它们是过程代码.我不知道如何对程序代码进行单元测试.单元测试假设我可以单独实例化我的应用程序.在实例化期间,我使用mocks/friendlies连接依赖项,这取代了真正的依赖项.使用程序编程没有任何"连线",因为没有对象,代码和数据是分开的.
小智 34
甲static方法是要被初始化一个类型的方法,其不需要任何对象为它被调用.您是否注意到在Java static中的main函数中使用了什么?程序执行从那里开始,没有创建对象.
请考虑以下示例:
class Languages
{
public static void main(String[] args)
{
display();
}
static void display()
{
System.out.println("Java is my favorite programming language.");
}
}
Run Code Online (Sandbox Code Playgroud)
Kev*_*tre 18
java中的静态方法属于该类(不是它的实例).它们不使用实例变量,通常从参数中获取输入,对其执行操作,然后返回一些结果.Instances方法与对象相关联,顾名思义,它可以使用实例变量.
Ind*_*234 11
如果对任何方法应用static关键字,则称为静态方法.
//更改所有对象的公共属性的程序(静态字段).
class Student9{
int rollno;
String name;
static String college = "ITS";
static void change(){
college = "BBDIT";
}
Student9(int r, String n){
rollno = r;
name = n;
}
void display (){System.out.println(rollno+" "+name+" "+college);}
public static void main(String args[]){
Student9.change();
Student9 s1 = new Student9 (111,"Indian");
Student9 s2 = new Student9 (222,"American");
Student9 s3 = new Student9 (333,"China");
s1.display();
s2.display();
s3.display();
} }
Run Code Online (Sandbox Code Playgroud)
O/P:111印度BBDIT 222美国BBDIT 333中国BBDIT
静态方法与实例无关,因此它们无法访问类中的任何非静态字段.
如果方法不使用类的任何字段(或仅静态字段),则可以使用静态方法.
如果使用类的任何非静态字段,则必须使用非静态方法.
应该在类上调用静态方法,在类的实例上调用实例方法。但这实际上意味着什么?这是一个有用的示例:
汽车类可能具有称为Accelerate()的实例方法。如果汽车确实存在(已经建造),则只能加速汽车,因此这将是一个实例方法。
汽车类也可能有一个称为GetCarCount()的计数方法。这将返回创建(或建造)的汽车总数。如果尚未构建汽车,则此方法将返回0,但仍应能够调用它,因此它必须是静态方法。
小智 6
实际上,我们在类中使用静态属性和方法,当我们想要使用我们程序的某些部分应该存在时,直到我们的程序运行.我们知道,要操纵静态属性,我们需要静态方法,因为它们不是实例变量的一部分.如果没有静态方法,操作静态属性非常耗时.
| 归档时间: |
|
| 查看次数: |
1093240 次 |
| 最近记录: |