English 中文(简体)
Java方法是否因违约而固定?
原标题:Should Java methods be static by default?
  • 时间:2010-07-27 18:37:28
  •  标签:
  • java
  • oop

您在A. foo don中重新撰写foo(>。 你们根本不知道oo是什么,或者它如何做。 它可以做任何事情。

oo是否总是静止的,而不论是否有任何其他考虑? 为什么不呢?

我的班子似乎总是累积许多私人助手方法,因为我的任务中断,适用唯一的标准原则。 其中大多数并不依赖物体状态,但从不使用该类本身的方法。 他们是否因违约而静态? 采用大量内部静态方法?

最佳回答

为了回答关于标题的问题,总体来说, Java方法应当而不是<>em>,即为默认。 Java是一种面向目标的语言。

然而,你所谈的一点是不同的。 你特别谈到帮助办法。

求助器方法中,仅仅将价值作为参数,并在没有进入国家的情况下将价值作为回报。 私人和静态。 我要强调:

Helper methods that do not access state should be static.


1. Major advantage: the code is more expressive.

使这些方法静态至少具有重大优势:你在《守则》中将其完全明确,该方法不必知道任何情况。

守则本身是这样说的。 对读过你的法典的其他人,甚至对你们来说,事情变得更加明显。

2. Another advantage: the code can be simpler to reason about.

如果你确保这种方法不取决于外部或全球国家,那么它就是一个pure function,即mathematical意义的功能:就同一投入而言,你可以肯定地获得同样的产出。

3. Optimization advantages

如果这种方法是静态的,是一种纯粹的功能,那么在某些情况下,它可以是memoized,以获得一些业绩收益(改变使用更多的记忆)。

4. Bytecode-level differences

在星码一级,如果你宣布助手方法为试算法或静态方法,你获得两种完全不同的东西。

为了帮助使这一部分更容易理解,请举一个例子:

public class App {
    public static void main(String[] args) {
        WithoutStaticMethods without = new WithoutStaticMethods();
        without.setValue(1);
        without.calculate();

        WithStaticMethods with = new WithStaticMethods();
        with.setValue(1);
        with.calculate();
    }
}

class WithoutStaticMethods {

    private int value;

    private int helper(int a, int b) {
        return a * b + 1;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int calculate() {
        return helper(value, 2 * value);
    }
}

class WithStaticMethods {

    private int value;

    private static int helper(int a, int b) {
        return a * b + 1;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int calculate() {
        return helper(value, 2 * value);
    }
}

我们感兴趣的是<条码>求助器(......)关于<条码>的电话,和<条码>。

Without static methods

在第一种情况下,如果没有静态方法,当你称之为“助手”方法时,联合核查机制需要把提及该案例的引向invokespecial。 研究了<条码>标准/代码>方法:

 0 aload_0
 1 aload_0
 2 getfield #2 <app/WithoutStaticMethods.value>
 5 iconst_2
 6 aload_0
 7 getfield #2 <app/WithoutStaticMethods.value>
10 imul
11 invokespecial #3 <app/WithoutStaticMethods.helper>
14 ireturn

指令0(或1),aload_0,将提及栏目,以后将使用<代码>invokespecial。 这项指示将把这一价值作为<代码>求助器(......)功能的第一参数,并且从未使用过,因为我们在这里可以看到:

0 iload_1
1 iload_2
2 imul
3 iconst_1
4 iadd
5 ireturn

iload_0? 这批货物是不必要的。

With static methods

现在,如果你宣布“助手”方法,那么<条码> 缩略语(方法将采用如下方法:

 0 aload_0
 1 getfield #2 <app/WithStaticMethods.value>
 4 iconst_2
 5 aload_0
 6 getfield #2 <app/WithStaticMethods.value>
 9 imul
10 invokestatic #3 <app/WithStaticMethods.helper>
13 ireturn

差异是:

  • there s one less aload_0 instruction
  • the helper method is now called with invokestatic

帮助者职能守则也没有什么差别:作为第一个参数,没有<条码><>/条码>,因此这些参数实际上处于0和1的位置,我们在这里可以看到:

0 iload_0
1 iload_1
2 imul
3 iconst_1
4 iadd
5 ireturn

Conclusion

从法典设计的角度来说,宣布“助手”方法静态更有意义:守则本身载有更有用的信息。 它指出,它不需要证明工作。

在星码一级,情况更加清楚,没有使用法(尽管我认为联合技术公司无法优化其使用,但不会产生巨大的业绩成本)。

问题回答

如果一种方法不使用实例数据,则该方法应当固定不变。 如果这一职能是公开的,这将大大提高效率,使你无需为仅仅称职的物体制造一个多余的事例。 也许更重要的是自我文件优势:通过宣布功能静态,你向读者电报这一功能不使用实例数据。

我不理解许多海报在这里的情绪,即在 Java方案中,固定职能是错误的。 如果一项功能在逻辑上是静止的,它就变得静止不变。 Java图书馆有许多固定功能。 马蒂班的固定功能相当高。

如果我需要的话,计算一个广场根基的职能是合理的方式:

public class MathUtils
{
  public static float squareRoot(float x)
  {
    ... calculate square root of parameter x ...
    return root;
  }
}

您可以提出“更远的有机产品”版本,这样可以:

public class MathUtils
{
  private float x;
  public MathUtils(float x)
  {
    this.x=x;
  }
  public float squareRoot()
  {
    ... calculate square root of this.x ...
    return root;
  }
}

但是,除了实现尽可能利用本组织这一一些抽象目标外,如何做到这一点? 它采用更多的法典,其灵活性较低。

(是,现在,在标准的Math类中,我有真正的根本功能。) 我只是将这一点当作一个方便的例子。

如果只使用静态功能,而且每一种可能使用都来自某一类别,那么,是,使其成为该类别的成员。 如果从课堂外调取这种说法是没有道理的,那就使之是私的。

如果固定功能合乎逻辑地与某一类别有关,但可以合理地从外部召唤,那么这种功能便成为公开的静态。 和 Java s parse 固定功能属于Integer类,因为它必须涉及惯性,因此这是合理地加以表述。

另一方面,经常发生的情况是,你重写一个类别,你认识到,你需要某种固定功能,但这一职能与这一类别并不真正挂钩。 这是你第一次认识到你需要,但可能完全合理地被与你现在做的工作毫无关系的其他阶层所利用。 同样,如果你有一个包含纬度和长度的“Place”类别,你希望能够计算两个地点之间的距离,而作为计算的一部分,你需要一个广场根基(并假定标准图书馆没有固定的根本功能),那么就会产生一种单独的核心功能,而不是将这一功能纳入你的大逻辑。 但是,这确实属于你们。 位置班。 现在是为“数学公用事业”或某些此类设施另设一个类别的时候了。

你们问,“oo是否总是静态的,不论是否有任何其他考虑?” 我这样说“几乎但并非完全”

我认为,使之不会静态的唯一原因是,如果一个子阶级想要推翻它。

我可以想到任何其他原因,但我不会排除这种可能性。 我不愿说“在任何情况下”什么,因为人们通常会提出某些特殊案例。

问题。 从实际来看,我看不出制定“<代码”的语句。 A 静态私人助手方法(除非与<代码>A中可公开查阅的静态方法有关)。 您不再获取任何东西——根据定义,任何可能需要的方法都已在其掌握下有<代码>A。 而且,由于他们重新采用“先令”帮助手法,你(或另一位同事)最终就没有选择哪一位无国籍的帮助者可能实际上从知道国家中受益,这可能会导致一种令人振奋的活力。

我认为,最后采用大量内部静态方法不会有什么好处。 我说,除非你有很好的理由不这样做,否则就不成立。

页: 1 法定方法应当是例外。 联络处全都涉及在物体国家周围有行为的物体。 理想的情况是,没有任何(或很少)静态方法,因为与目标国无关的一切都可能(并且避免主导反对的概念,应当)被置于模块级的固定旧功能中。 工厂由于复杂性而可能例外,从Cartesian(以血清为例)来看情况良好。

当然,这(编辑:模块级职能)在单一语言(编辑:如 Java)中是不可能做到的,因此,我这样一来就是用多种语言设计的专用倡导者。 但是,即便是用一种专用于联络处的语文,大多数方法将围绕目标状态,因此是非正常的。 也就是说,除非你的设计与联络处无关——但在这种情况下,你重新使用错误的语言。

通常

www.un.org/Depts/DGACM/index_spanish.htm 按照需要执行这些步骤:

a) 我用成员的方法撰写了一些法典,图示我可能重新使用其中一些法典和一些法典。

www.un.org/Depts/DGACM/index_spanish.htm 摘自非统计方法

b) 现在,我看看,这种方法是否需要进入国家,或者如果我能够将其需要纳入一个或两个参数和返回说明。 如果是:

<Make methods ( private)的静态

c) 如果我发现,我可以在同一一揽子方案一的其他类别中使用这一守则。

公开和移动方法 一揽子帮助班的方法,有缺陷的可见度

E.g. 在包装上com.mycompany.foo.bar.phleeem 我将设立一个类别:<代码>最低限值/代码>,或<代码> 轨道值/代码>,标明违约可见度。

d) 如果我当时认识到,在我提出申请之前,我需要这一功能。

www.un.org/Depts/DGACM/index_spanish.htm 将助手班改为专用公用事业包

例如,com.mycompany.foo.utils.PhleeemUtils

一般而言,我喜欢尽可能少可见的概念。 那些不需要我的方法的人看不到。 因此,我开始私下接触,转向一揽子准入,在一揽子计划中只公布内容。

除非在物体参考中通过,否则,关于某一类的<编码>static方法规定,该方法本身不能更改该物体,因为它无法查阅this。 在这方面,<代码>static modifier向方案管理员提供关于该方法的意图的信息,即该方法是免费的。

反静剂分子可能希望将这些产品移入反使用分子当然反对的公用事业类别。 但在现实中,人为地将这些方法从他们唯一的电话站移走,除了紧凑到新的公用事业类别之外,还取得了一些成就。

盲目将通用方法引入自己的班级的问题,是这些公用事业应当真正作为新的公共宣传工具对待,即使它只消耗了原法典。 很少有开发商在做保后不考虑这一点。 快速向使用高用途类的其他发展中国家。 有些人后来对展期做了改动,以适应自己。 如果你放弃试验或两次休息,但可能不是。

我一般不让他们静态,但也许应该这样做。 告诉下一位编码员说,这一方法修改了你的目标状况,在你修改接触你正在改变方法性质的成员的方法时,给你发出警告,很有价值。

编码是指与下一艘手提-登式拖车就使该代码运行感到担忧的。 因此,为了尽量扩大沟通,我说,如果你真的需要这种帮助者,那就是一个伟大的想法。 除非你做一个数学,否则让它成为私人也是关键的。 如同班级。

Java混淆了模块、名称空间、粘贴和类别等概念,从而声称某些以阶层为导向的SOO-purity应当防止你将java类作为模块、名称空间或粘合剂使用。

这种方法应该是静态的。 当然,内部支助方法应当是私人的;保护辅助方法;公用事业职能应当公开。 此外,静态领域、静态不变和公开静态方法之间也存在差异。 第一个是全球变数的另外一个词;几乎总是要避免,即使通过接触者的方法进行调解,也只会限制损害。 第二,将java类作为具有象征意义的固定、完全可以接受的名称空间。 第三是将java类作为功能的一种模块处理,因为一般规则副作用应当避免,或在必要时仅限于该功能的任何参数。 静态的使用将有助于确保你不会无意地通过接触目标成员来打破这种局面。

你们发现的另一个情况是,你在java撰写实用守则。 此时,业务处-主管拟定的多数司规则都从窗户外走。 你们会发现一门完全固定方法的班子,而公共固定功能的固定功能则会与匿名内心器相挂钩。

最终,java的透镜构造非常薄弱,将许多概念归入同一类别和相联。 你们应如此无所作为,因为大家感到可以自由使用 j设施提供名称空间、自动取款机、单元等,而你们认为有必要这样做。

我认为,很难赞同这些非统计方法理论。 它们促进一种完全以卫生目标为导向的模式,防止偏离目标关系。 我看不出任何东西对于在实践中纯粹以目标为导向是绝对的。

不管怎么说,都是 j。 射线级为静态。 Numericlyn Integer, Boolean, String有静态方法。 固定方法的漏洞。 这些班级的所有静态方法要么转换到或从各自的班级。

旧的Gosling等人证明是采用静态方法的这种有用的榜样,因此没有避免这种作用。 我知道,有人 enough忙投票推翻我的答复。 很多方案者希望把自己大部分成员转为静态的原因和习惯为何。

我曾经在一个机构工作过,该项目领导人希望我们尽可能地静态地确定方法并最后确定这些方法。 另一方面,我不是这样极端。 与数据库图形设计一样,它都取决于你的数据建模战略。

应当有一个一贯的理由,说明为什么方法固定不变。 采用标准的Java图书馆模式,如果方法固定不变,则不会受到伤害。

最为重要的是方案生产力和质量。 在适应性强的发展中环境中,它不仅正在调整该项目的精度,以有效应对需求变化,而且正在调整方案拟定气氛,如提供符合要求的编码模式,以最佳利用你制定的方案拟订技能。 归根结底(一个几乎永远不会结束的项目),你想要团队成员高效、有效,而不是避免静态方法。

因此,设计了一种方案模式,无论你是否想要MVP、注射、方面驱动、静态避免/富裕程度等等,并知道你为什么要这样做——并不是因为一些理论的营养告诉你,你的方案拟订做法将违反禁忌原则。 如果你在某一行业工作,它总是具有质量和利润,而不是理论上的纯度。

最后,目标方向是什么? 定向和数据正常化是创造全方位信息视角的战略。 例如,在较早的几天里,IBM的手册被写成非常精干的。 也就是说,如果在几千份手册的页数中写了一幅信息,就避免重复这一信息。 情况不佳,因为你将读懂如何履行某些任务,并经常遇到其他手册中提到的概念,你必须熟悉手册的“数据模型”,以防那些将信息 in与数千本手册联系起来的人。

出于同样的原因,SOS/2未能与微软公司竞争,因为IBM的常识概念纯粹是机器和数据,IBM如此自豪地宣布其真正的目标导向性,即Microsoft的假目标导向,符合人类观点。 他们忘记了我们的人对不符合数据和机器的或甚至相互不相符合的信息有不同的认识。

如果你熟悉树木的地形,你会相信,你可以找到任何叶子,把它扎根。 甚至连任何 no,如果你不怀有多面树。 每个人都认为,当事实上任何东西都可能成为根基时,他/她的话就是一个根本问题。 如果你认为你的反对倾向是明智之举,那么再次思考。 更重要的是要尽量减少作为候选人根基的节点。

必须在效力和效率之间达成妥协。 具有高效率的数据或目标模型这一点是没有意义的,而这种数据或物体模型很难被同行方案者有效利用。

如果与这一类物体无关,但实际上属于这一类(我会考虑将其移至别处),那么,这应该是静止的。

如果你可以避免的话,不会静态使用。 它与继承发生冲突(压倒一切)。

此外,没有问答,但略有关联,没有使通用方法公开。

至于其他方面,我同意问题。 如果你装上了可能固定的方法,而这种方法并不使用国家,只是将其归入私人类别,或者可能受到保护或一揽子保护。

It depends i.g. java.lang.Math has no method which isn t static. (You could do a static import to write cos() instead of Math.cos()) This shouldn t be overused but as some code that is intented to be called as a utility it would be acceptable. I.g Thread.currentThread()

采用静态方法确定一种不必与该类制造的物体,但该类本身不相关的方法(或该物质的变数)。 例如,你需要一个变量来计算制造的物体数目。 你们会说一些东西:私人静态事件=0;然后,在构造中就一些情况,这样你就可以保留。

在建立固定方法之前,很难想象,但有时是好的解决办法。

Chau Blach in "Item1: consider Static Factory Methods und of Constructors” in Effective Java, is a very persuasive case that sign methods can be well benefit. 他给了 j。 收集量为32种固定工厂方法。

在一个案例中,我拥有一个POJO级的等级,这些班级的频率可以自动地归入XML和JSON,然后将其重新注入物体。 我有静态方法,使用 Java素来进行脱硫: fromXML(String xml) fromJSON(String json)。 他们返回的类型是事先知道的,但由XML或JSON文本确定。 (我原来将这些方法归入一个助手类别,但是,将这种静态方法移入根除的POJO类,是比较清洁的。)

其他几个例子:

  • Using a class as a namespace to group related methods (eg, java.lang.Math).
  • The method truly is a private class-specific helper method with no need to access instance variables (the case cited here). Just don t sneak a this-equivalent into its argument list!

但是,不要不思议地使用静态,或者你冒着危险,会陷入一个更加分散和更加程序性的方案拟订方式。

无,静态物质的使用应当非常特殊。

在这种情况下,欧佩组织有可能躲藏在固定方法参数中。 提出这一问题的方式使得这种不矛盾之处(foo(><>foo(>>)>没有投入或产出,但我认为,在现实的世界实例中,实际上应该成为目标国的一部分的内容会很快消失。

当天末,每打<代码>obj.method(param)method(obj, param),但以低于我们设计的水平。

如果它只被A类方法所使用,并且不会在A类方法之外使用,那么它就应当固定(而且可能的话,应归入帮助类)。 它现在没有在A之外使用,但没有任何保障。 否则,它就没有。

如果它没有与A国有任何关系,那么它可以在其他地方有用。

不管怎么说,这确实是一个很好的理由,说明 Java方法因违约而静止不变。

谈到最后一个问题,它们应该不停地固定下来,因为必须在撰写静态方法之前写固定的字句。 当你有异质的团队( Java最有用的团队)时,这是一种良好做法。

当你写固定方法时,你应牢记,你在静态进口(使其看上免费的班级)的使用现场使用gon,因此,它应当像一种功能一样行事,这种功能既无任何作用,又可能不会退回,并且与它所属的班级相隔绝。 因此,静态方法应当是一种罕见的情况。

如果你似乎正在采取许多帮助方法,那么就考虑采用一揽子-私法方法,而不是私人方法。 减少打字,减少碎打,因为你可以把他们重新用作同一包裹中其他班子的助手。

我认为,“私人静态”(编辑:方法)是 Java的一种oxy。 我认为,静态方法的要点是提供在物体情况之外获取功能的机会。 换言之,如果他们重新公开,他们实际上只会再次有用。 如果你只是从单一物体的角度来看重新使用一种方法,而且这种方法是非公开的,那么这样做是毫无意义的。 (编辑:但无实际区别)。

在这种情况下,我通常试图使这种方法变得足够抽象,使其在其他情况下更有用,而且我将其公布在一个通用类别中。 把它看作是支持图书馆守则的写法,很难想象一下你的话。

多数静态方法都是用文字写的,因为大多数静态方法都是用的。

  1. You break down a complex method into submethods, or
  2. You wish String (or Date, or...) had some functionality that it doesn t have

前者本身不是坏的,但常常是你收回物体的迹象。 避免与“强权”或“名单”等缺省类工作,试图发明自己的类别,并将静态方法移至这些类别。

第二种原因产生总是流行的强食、 Date、肥料。 这些问题有问题,因为你无法发现存在这些方法,因此,方案人员经常重复这些通用方法。 解决办法再次是为了避免一切时间使用强令和日期。 开始制造自己的物体,或许总结原始物体。 静态方法成为新物体的非静态方法。

如果foo(>,则无与目标有任何关系。 A,那么为什么在其中采用这种方法?

法定方法仍然适用。 如果当时没有任何进展,那么你为什么写不与它有任何关系的方法?

如果禁忌是私人的,则可能是静态的。 但是,大部分时间是而不是静态,因为这些字数不一。 那么,如果由于你改变你的法典,你需要利用这个国家,你就可以这样做。

When it is protected or public, it depends on what it does. A rule of thumb is to make it not static when it isn t a part of the instance s behaviour, and make it static when it makes sense to call it without any object. If you are unsure, ask yourself if it makes sense to override the method in a subclass.

我认为,让贾瓦的方法静态化,将导致开端人非常混乱地实施,他们正确理解联络处。 我们早就这样做了。 如果这些方法固定为默认,那么我们难以理解联络处的原则?

因此,如果你主宰这一概念,那么在方法上(由于重新推算)一概不成不变。 我认为,我们不禁要这样做。

NB:让我猜测一下,你是否有机会读到

大量有趣的答复。

如果你急切地寻求一条规则,则使用:

如果该守则只是偶尔使用单一类别的方法,那么它就成为一种实例方法——它只是从某种情况中提取编码,而这种方法可以被重新纳入(或脱离)进入实例状态的方法。

如果该法典被卫生部THAN ONE级使用,并且该方法所居住的类别中无法使用实例变量,那么该代码就变得静止不变。

结束故事。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...