English 中文(简体)
在施工人员离开之前获得最后变量
原标题:Accessing a final variable before constructor exit
  • 时间:2012-04-12 18:21:48
  •  标签:
  • java

Okay, I ve与优异的Jodatime图书馆相距甚远,试图实施一个普通的零售/信托(4-5-4)日历。 我已经找到了我公司的具体案例,但一般案件(主要是确定年初和租赁年份)是杀手;例如,有一套日期,即两个财政年度(通常为364天)将在1个标准化组织年度内开始。

在确定年度启动规则的过程中,我最后总结出一个抽象的类别和两个确定年份的具体类别,其依据是国际标准化组织的起始日。

(四舍五入)

private static abstract class SimpleFiscalYearEndPattern implements FiscalYearEndPattern {

    protected final int leapYearCountOffset;
    protected final int doomsdayOffset;

    private final int startingDayOfWeek;
    private final int yearOffset;
    private final long millisFromEpochToFiscalYearStart;
    private final long millisElapsedToEpochDividedByTwo;

    /**
     * Restricted constructor
     * @param fiscalYear
     * @param startingOn
     * @param inFirstWeek
     */
    protected SimpleFiscalYearEndPattern(final int fiscalYear, final LocalDate startingOn, final MonthDay inFirstWeek) {
        this.yearOffset = fiscalYear - startingOn.getYear();
        this.doomsdayOffset = getDoomsdayOffset(inFirstWeek);
        this.startingDayOfWeek = startingOn.getDayOfWeek();

        final int startingDoomsday = getDoomsdayOffset(new MonthDay(startingOn, REFERENCE_CHRONOLOGY));
        // If the starting doomsday is a later day-of-week, it needs to become negative.
        this.leapYearCountOffset = calculateLeapYearCountOffset(startingDoomsday : doomsdayOffset, doomsdayOffset);

        final int leapYearsBefore = getPreviousLeapYears(fiscalYearBeforeEpoch);
    }
}

具体类别(日期: 1/7 - 2/28):

private static final class BeforeLeapYearEndPattern extends SimpleFiscalYearEndPattern {

    private static final int FIRST_YEAR_LEAP_YEAR_OFFSET = -1;

    private BeforeLeapYearEndPattern(final int fiscalYear, final LocalDate startingOn, final MonthDay onOrBefore) {
        super(fiscalYear, startingOn, onOrBefore);
    }

    public static final BeforeLeapYearEndPattern create(final int fiscalYear, final LocalDate startingOn, final MonthDay onOrBefore) {
        return new BeforeLeapYearEndPattern(fiscalYear, startingOn, onOrBefore);
    }

    /* (non-Javadoc)
     * @see ext.site.time.chrono.FiscalYearEndPatternBuilder.SimpleFiscalYearEndPattern#getPreviousLeapYears(int)
     */
    @Override
    protected int getPreviousLeapYears(final int isoYear) {
        // Formula gets count of leap years, including current, so subtract a year first.
        final int previousYear = isoYear - 1;
        // If the doomsday offset is -1, then the first year is a leap year.
        return (previousYear + leapYearCountOffset + (previousYear / 4) - (previousYear / 100) + (previousYear / 400)) / 7 + (leapYearCountOffset == FIRST_YEAR_LEAP_YEAR_OFFSET ? 1 : 0);
    }

如果你注意到,我使用<条码>,代谢年份,该代码(作为最后变量)在“条码”的抽象超级类别中加以界定,然后由超级层建筑商标明。 我不想重复上层建筑商的公式——它对于第3/1-12/31号系列中的日期有不同;我也不想将实例变数列入具体的子类——其他计算仍然需要<条码>。

www.un.org/spanish/ecosoc 问题: 当建筑商要求使用(子级)方法时,<条码>的状态是什么? 它是否以任何方式得到保障,或者在汇编者之意下可能发生变化的东西? 我怎么能检验一下? 我已经知道,汇编者可以自由地重新安排一些发言,但会(可能)在这里出现?

最佳回答

由于在<条码>后添加了<条码>,>代谢年限值/代码>,<条码>年限值/代码>将妥为初步确定,<条码>


Java留下了确保“<代码>final变量”的举证责任,这些变量在施工期间用代码获得,在第一次进入之前就得到适当的初步使用。 如果不适当初步采用,在施工过程中使用的代码将对该实地类型的数值为零。

该方案

public class Foo {
  protected final int x;
  Foo() {
    foo();
    this.x = 1;
    foo();
  }
  void foo() { System.out.println(this.x); }
  public static void main(String[] argv) { new Foo(); }
}

印刷

0
1

x以来,在第一次打电话到foo时,没有初步采用,但如上所述,你没有问题。


“生命线”指出,在构造中,每一次使用最终都必须在初始化之后,但不能为其他方法提供这种保障。 评 注

abstract class C {
  public final int x;

  C() {
    this.x = f();
  }

  abstract int f();
}

为确保在每次使用之前先采用<代码>x<>>>/代码”的语文,需要确保不出现子类。

class D extends C {
  int f() {
    return this.x;
  }
}

这就要求全球说明与 Java动态联系相左的班级,并在语言说明中增加许多复杂性。

问题回答

<代码>定式<>代码>变量的保证之一是,汇编者在重新分配之前就赢得了笔录。 因此,如果它汇编(应该编辑),你会回想!

虽然《<条码>保证其具有最终价值,但这一事故仍待发生。 在子类初始化开始之前,采用<代码>植被更新/代码>的方法,因此子类别中的任何变数都将具有违约值(0或0)。

现在不存在危险,但是如果有人加入和修改<代码>。 在LeapYearEndPattern之前,通过添加新的<代码>final例变量,然后用在上。

它认为,这个问题是由内部渗透和相互渗透的 se混杂造成的。

只要你把有关守则放在一只一面,你就会期望:重新排列法典不会产生明显的影响。

<代码>final领域也是如此。 <代码>final 领域为同时使用提供了额外保障,这些保障在建筑商完工后才会生效。 因此,它建议不要在施工商完工之前将<代码>final的田地提供给其他校对。 但是,只要你不试图从其他渠道进入有关领域,那就没有问题了。

然而,我同意,从超级阶级的校长那里寻找子级方法是一种坏的做法,因为当时没有开始使用子级田。





相关问题
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 ...