【问题标题】:Traditional Practice to initialize the field members of a class初始化类的字段成员的传统做法
【发布时间】:2011-10-05 23:33:33
【问题描述】:

我来自 C++ 背景,其中一个类的字段在构造函数中被初始化。但是这里是java,我看到我可以在声明时初始化,这与C++不同。

所以,我的问题是哪个是初始化任何类的字段成员的最佳/传统做法。难道……

  • 当时要申报吗?

    类 testClass { 私人int x = 100; }

  • 使用非静态范围?

    类测试类{ 私人int x; { x = 100; } }

  • 还是在构造函数内部?

    类测试类{ 私人int x; 测试类(){x = 100;} }

(由于我的背景,我有点偏向于在构造函数中初始化字段成员。)

【问题讨论】:

    标签: java


    【解决方案1】:

    我认为初始化成员变量没有“最佳实践”。显然,在 Java 中,您可以在声明中初始化它们,这很好,或者您可以从构造函数中进行初始化。除非您需要做一些复杂的事情(即获取对 DataSource 的引用或类似的可能只有通过传入构造函数的参数才可用的东西)。

    换句话说,没有“正确的方法”,一致性可能更重要。

    也就是说,请记住,如果您不这样做,Java 将为您初始化未初始化的成员变量。例如int 变量将设置为 0,boolean 变量将设置为 false,任何对象都将设置为 null,等等。

    【讨论】:

    • 因此,您通常没有任何可以选择初始化位置的字段。常量被声明为静态字段;对于一些复杂的对象(例如数据库连接),你总是需要传递一些参数(所以它只能去构造函数而不能去其他地方),一些原始变量的生命周期通常很短,所以它们在每个方法中分别声明。跨度>
    • 我认为构造方法对我来说更可取。我试图远离依赖语言的方法。
    • @iamcreasy:好吧,正如我已经说过的,如果你的代码设计得很好,通常你只有使用一些参数初始化的字段——因此它们不可能在声明中。你能给我任何可以放置在字段声明附近的字段初始化器的真实示例吗?
    • Max,有时(例如)我需要为类使用 Map 或 ArrayList,它们不需要任何特殊参数,可以在声明时初始化。但通常,正如您所说,您需要参数来初始化您的变量(甚至依赖注入,这可能是更好的做法)。
    • 我尽可能在声明后直接初始化。原因是您通常迟早会有多个构造函数。此外,如果它们没有被初始化(特别是像 class Thing { List<Parts> parts = new ArrayList<Parts>() ... } 这样的东西),读者可能会认为 part 可能为空,而实际上它总是指的是最坏情况下为空的数组。
    【解决方案2】:

    您应该编写看起来最简单、最清晰的代码。我更喜欢在一行中声明和初始化一个简单的值,然后分解更复杂的行。

    你可能会觉得这个概念很有趣。

    private final List<String> words = Arrays.asList("one", "two", "three");
    

    或使用双括号表示法。

    private final Map<String, Integer> map = new LinkedHashMap<String, Integer>() {{
        put("one", 1);
        put("two", 2);
        put("three", 3);
    }};
    

    【讨论】:

      【解决方案3】:

      虽然没有“最佳实践”,但在某些情况下某些方法效果最好。

      例如,如果您有一个简单的初始化值,那么您可以连同声明一起进行。

      如果你有复杂的初始化逻辑(例如数组初始化),它可以进入构造函数。

      如果您想跨构造函数共享通用初始化代码,则初始化程序块(非静态范围)很有用。

      您可以查看以下链接了解更多详情http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

      【讨论】:

        【解决方案4】:

        不知道我的问题是否正确,但您想知道如何初始化类中的变量吗?

            private String s;
        
        public EditListener(String s){
            this.s = s;
        }
        

        【讨论】:

        • 不是如何做,而是应该什么时候做以及为什么要做。
        • 他想知道是this.s = "abc"还是private String s = "abc"更好
        • 哦,我被告知要在构造函数中执行此操作。所以 this.s = "abc".
        • @Max 我想你的意思是private String s; public MyClass() { this.s = "abc"; } private String s = "abc"; ;)
        • @Peter Lawrey:确实如此,但是我的懒惰超出了我解释它的意愿:D
        猜你喜欢
        • 2016-08-02
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多