2015-08-27 2 views
2

Учитывая следующий класс:Java Final Геттеры

public class SomeClass { 

    private final int a; 

    public SomeClass(int a) { 
     this.a = a; 
    } 

} 

Что является более целесообразным с точки зрения полноты ?

public final int getA() { 
    return a; 
} 

ИЛИ

public int getA() { 
    return a; 
} 

На мой взгляд, оба эквивалентны, так что я бы даже не беспокоить положить final.

Но для того, чтобы быть полным, первый метод кажется более «правильным», чем второй.

+0

Вы так быстро приняли ответ, все ваши сомнения были решены? Я собирался дать вам еще одно решение. – user3437460

+0

@ user3437460 Я принял ответ rgettman, так как он прояснил мои заблуждения относительно окончательных методов. Поэтому я предполагаю, что, пытаясь ответить на мой собственный вопрос, я бы сказал, что второй метод будет наиболее правильным в большинстве ситуаций. –

+0

Беспокойство о «полноте», чаще всего, является отвлечением от любой проблемы, которую вы пытаетесь решить. Люди любят симметрию, но не пишу лишний код, чтобы сделать вещи симметричными. Каждая строка кода, которую вы пишете, становится ответственностью. Не пишите больше строк, чем вы _need_, чтобы писать, чтобы решить проблему. –

ответ

8

Ключевое слово final означает что-то совершенно другое при применении к методу, а не к переменной.

По способу это означает, что no subclass can override the method. Это не имеет никакого отношения к изменению значения. Итак, ваши два варианта не эквивалентны, из-за того, что подкласс может переопределить getA().

+0

Интересно, должно быть, пропустил этот момент, обучая себя Java :). Итак, допустим, я хотел вернуть «final int» по любой причине. Как это сделать? –

+3

Метод не может заставить возвращаемое значение не изменяться. Даже если вы объявляете локальную переменную «final» и возвращаете ее, вызывающий объект получает измененную копию в любом случае. Однако вызывающий может принудительно выполнить его, объявив переменную, которой он присваивает возвращаемое значение 'final', например. 'final int result = foo.getA();'. – rgettman

+0

@budi, нет такой вещи, как «final int». Когда вы пишете 'final int foo;', вы говорите две вещи: вы говорите, что переменная 'foo' содержит значение int, и вы говорите, что переменная может не обновляться. 'foo' является' final', а 'foo' имеет тип' int', но между 'final' и' int' нет связи. –

1

Согласно Oracle

Вы можете объявить некоторые или все методы методы класса конечных. Вы используете ключевое слово в объявлении метода, чтобы указать, что метод не может быть переопределен подклассами.

Так что это зависит от того, что вы подразумеваете под полнотой. Практически Однако это действительно зависит от того, хотите ли вы, чтобы getters был отменен.

3

Когда вы применяете final к разным вещам на Java, это дает вам почти совершенно другое значение.

final on variables: Значения не могут быть присвоены ему.

final on methods: Методы не могут быть переопределены подклассами

final on classes: Этот класс не может быть продлен еще на один класс.

Надеюсь, что вам что-то ясно.