查看完整版本 : Java 9 Interface private methods

assembly.jc 2017-11-14 02:23 AM

Java 9 Interface private methods

5 兄提起,Java 9 interface 又有新功能,容許 interface 有 private methods, private static methods,作為 helper methods。

自從 interface 有了 default methods 之後,default methods implementation 可能會很複雜,需要拆細成較短的 methods,但這些拆出來的 methods 應只有 interface 內部才可用,所以 private method 就應運而生了。

下面是一個簡單的例子,估下 output 是什麼 (最終那一個 genMsg() 被 call)? 另外,private methods 是好是壞,請指出。[code]interface Foo {
    public void run();

    default void hello() {
        System.out.println(genMsg());
    }

    private String genMsg() {
        return("Hello");
    }
}

public class PrivateMethodTest implements Foo {
    public static void main(String[] args) {
        new PrivateMethodTest().run();
    }

    @Override public void run() {
        hello();
    }

    private String genMsg() {
        return("***");
    }
}[/code]

煙民母親生賤種 2017-11-14 02:29 AM

只可以說這些都是違反了原本 interface 的原意 , 無話唔得,符合到某些目的, 有 D 人要咁樣用既, 就會 for, 唔係咁設計開既, 就會 against! :fst_011:

assembly.jc 2017-11-14 02:37 AM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 02:29 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470840343&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
只可以說這些都是違反了原本 interface 的原意 , 無話唔得,符合到某些目的, 有 D 人要咁樣用既, 就會 for, 唔係咁設計開既, 就會 against! :fst_011: [/quote]

煙兄咁夜? 是,已經唔可以叫做 interface 了。如果用起上來唔會出現誤解或引致更多 bug,倒也無傷大雅。反而更就手。

煙兄估唔估到個 output 係乜?

煙民母親生賤種 2017-11-14 02:56 AM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-11-14 02:37 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470840510&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]


煙兄咁夜? 是,已經唔可以叫做 interface 了。如果用起上來唔會出現誤解或引致更多 bug,倒也無傷大雅。反而更就手。

煙兄估唔估到個 output 係乜? [/quote]應一般 OOP 的概念, 應該是由自身 class 的 method call 起。所以應該係 output ***
正如 java inherit 一個 class, 個 constructor 內都要 call 一次 parent super()

煙民母親生賤種 2017-11-14 02:59 AM

況且, override private method, 亦唔符合  OOP encapsulation 的概念 :fst_011:

Susan﹏汪汪 2017-11-14 08:19 AM

C#的interface只係半成品

個意思係講C#的struct如果confirm任何interface
使用時好容易冇左value-type semantics

Generic function 也只可以value type 同reference type 二擇一

Susan﹏汪汪 2017-11-14 09:54 AM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-11-14 02:23 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470840228&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
5 兄提起,Java 9 interface 又有新功能,容許 interface 有 private methods, private static methods,作為 helper methods。

自從 interface 有了 default methods 之後,default methods implementation 可能 ... [/quote]
Java 9個interface新功能似係受到swift影響

Swift已經發展出完整的protocol oriented programming

Java 9呢個新功能係習得其形習不得其神

Susan﹏汪汪 2017-11-14 10:45 AM

用概念去講
以汪汪寫過的語言去說明

C++的template其實係非常經典的鴨子模型
用汪汪之前寫的sorting做例[code]template <class Compare, class BirdirectionalIterator>
void sort(BirdirectionalIterator first, BirdirectionalIterator last, Compare comp)
{
   
    typedef typename std::iterator_traits<BirdirectionalIterator>::value_type value_type;
   
    const auto _l = last - 1;
   
    if (first < _l) {
        
        auto forward = first, backward = _l;
        const value_type val = *_l;
        
        for (; forward < backward; ++forward)
        {
            while (comp(*forward, val) && forward < backward) ++forward;
            while (comp(val, *backward) && forward < backward) --backward;
            swap(*forward, *backward);
        }
        swap(*backward, *_l);
        
        sort(first, backward, comp);
        sort(backward, last, comp);
    }
}[/code]呢到的template雖然係話要求一個BirdirectionalIterator
但C++的template係完全冇約束力

可以先看看呢到: [url=http://en.cppreference.com/w/cpp/iterator]http://en.cppreference.com/w/cpp/iterator[/url]
好明顯
汪汪個function呢一行係錯誤的[code]const auto _l = last - 1;[/code]因為C++概念入面BidirectionalIterator係沒有operator -

但正因為C++的template係冇約束力, compiler係照樣通過的
如果你放一個pointer入去, BirdirectionalIterator會單純的replace做pointer
而pointer係有operator -所以能夠正常咁行
如果放一個沒有operator -的container入去, 就compile唔到


接著到C#

C#的interface係有約束力
用微軟document做例: [url]https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters[/url][code]class EmployeeList<T> where T : Employee
{
    // ...
}[/code]呢到的T係有多個約束條件
所謂的約束條件不是指C++咁只要有個形就過到骨

就算你寫個T係有齊 Employee的所有methods
只要個T不是confirm to Employee
一樣不能放入EmployeeList裡面

但C#的interface概念就止於此


Swift發展的protocol oriented programming著眼點已經不在約束條件
而係描述protocol的功能性

比如一個Sequence[code]public protocol Sequence {
  /// A type representing the sequence's elements.
  associatedtype Element

  /// A type that provides the sequence's iteration interface and
  /// encapsulates its iteration state.
  associatedtype Iterator : IteratorProtocol where Iterator.Element == Element

  /// A type that represents a subsequence of some of the sequence's elements.
  associatedtype SubSequence : Sequence = AnySequence<Element>
    where Element == SubSequence.Element,
          SubSequence.SubSequence == SubSequence[/code]呢個係standard library的Sequence的一部分
POP係著眼於如何準確描述protocol的行為
好似Sequence.SubSequence咁, 係需要嚴格定義好SubSequence的約束條件

不會無端端比個Sequence的SubSequence不是一個Sequence
或者Sequence的SubSequence同本身的的Sequence的Element不同type

呢個係POP的基礎

有左個基礎之後
POP就會同OOP一樣談論"is a"

一個confirm protocol Sequence的Object
就應該擁有Sequence的功能, 呢個係理所當然

POP最一大特色係說明我們可以跟據protocol的屬性
寫一些屬於Sequence的固有或添力功能

例如Sequence
Sequence的定義可以有個map 呢個method, 提供functional programming的功能[code]func map<T>(
    _ transform: (Element) throws -> T
  ) rethrows -> [T][/code]但如果一個struct或class要confirm Sequence
結果係必須要implement呢個map method

所以就變成由protocol去implement
struct或class則是選擇性override

[[i] 本帖最後由 Susan﹏汪汪 於 2017-11-14 10:49 AM 編輯 [/i]]

Susan﹏汪汪 2017-11-14 10:57 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 10:45 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470850377&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
用概念去講
以汪汪寫過的語言去說明

C++的template其實係非常經典的鴨子模型
用汪汪之前寫的sorting做例template
void sort(BirdirectionalIterator first, BirdirectionalIterator last, Compare comp)
{
... [/quote]

而POP最精彩的地方
不是OOP的inheritance關係

如果只係講inheritance, 同過去一樣繼續寫OOP係完全冇問題
POP的不同的地方在於value type的價值

value type必須保持value semantics先有其意義
不過呢部分就唔講了

附片一條
https://developer.apple.com/videos/play/wwdc2015/408/

[[i] 本帖最後由 Susan﹏汪汪 於 2017-11-14 12:02 PM 編輯 [/i]]

煙民母親生賤種 2017-11-14 12:05 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 10:45 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470850377&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
C#的interface係有約束力
用微軟document做例: [url=https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters]https://docs.microsoft.com/en-us ... -on-type-parameters[/url] [/quote]where T , 係 restrict type to something, 關咩有約束力事? :fst_012:

Susan﹏汪汪 2017-11-14 12:45 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 12:05 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470854090&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
where T , 係 restrict type to something, 關咩有約束力事? :fst_012: [/quote]
你自己都識講restrict type to something
呢個咪就係約束條件

fitcat07 2017-11-14 12:46 PM

我記得interface內嘅private method係唔可以overridden。測試過證明冇記錯,顯示hello。


好處:減少重複碼。
壞處:設計時就要清楚default methods,如何call private methods。當釋出interface後,不能再修改default methods對外行為,連帶private methods亦不能。雖則定義為private,但就做唔到encapsulation,唯一目的係滅少重複碼,用另一個access modifier會更好,又或使用annotations,@Share之類。

煙民母親生賤種 2017-11-14 01:04 PM

[quote]原帖由 [i]fitcat07[/i] 於 2017-11-14 12:46 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470855985&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
雖則定義為private,但就做唔到encapsulation[/quote]咁咪即係亂膠哂龍?:fst_008:基本法一野打破, 並實施全國性法律 :fst_012:

[[i] 本帖最後由 煙民母親生賤種 於 2017-11-14 01:05 PM 編輯 [/i]]

煙民母親生賤種 2017-11-14 01:06 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 12:45 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470855941&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

你自己都識講restrict type to something
呢個咪就係約束條件 [/quote]呢個係附加功能, 並唔係強制一定要 restrict 喎! :fst_004:

Susan﹏汪汪 2017-11-14 01:13 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 01:06 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470856857&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
呢個係附加功能, 並唔係強制一定要 restrict 喎! :fst_004: [/quote]
你到底有冇寫過C#?
你試下放Employee以外的Type落EmployeeList

附加功能:smile_30:

Susan﹏汪汪 2017-11-14 02:36 PM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 02:59 AM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470840826&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
況且, override private method, 亦唔符合?OOP encapsulation 的概念 :fst_011: [/quote]
private methods從來都不是用來override 用
講話private methods 做唔到encapsulation又係得啖笑

唔講Java 9的interface private methods

講返一般class 的access control
之所以要分private、protected同public 三個層級

就正正因為class 裡面的methods並不是全部都可以給外面知道

尤其係private methods
屬於呢個層級的功能係必須隱藏、不可公開的
因為呢類methods不屬於published interface 的一部分
如樓主一開始所講一樣、呢類methods只係helper methods

如果你走去用任何外在方法override
完全係破壞encapsulation的行為

Java 9的新功能也一樣
interface private methods不是用來override 用
而係用來簡化default implementation 之用

也所以要做override也都不是private methods下手
而係由public 的methods 進行

如果subclass 係需要對private method做override
咁個method本身就不應該係private

而係應該改成需要documents 支持的public methods

Subclass 也需要按其功能進行override

[[i] 本帖最後由 Susan﹏汪汪 於 2017-11-14 02:40 PM 編輯 [/i]]

Susan﹏汪汪 2017-11-14 03:06 PM

汪汪寫swift最就手、不過概念一樣

汪汪繼續用swift解釋樓主提到interface 的private methods好壞問題

汪汪前面講Swift的POP
Java 都肯定係向呢個方向進行發展
不過目前來講還是習不得其神
因為完整的POP除左技術條件外
程式員本身的概念認知、library 寫得夠唔夠完善等都係重要因素

汪汪用sorting 做例子
[code]extension Collection where Element : Comparable {
   
   
    private func quick_sort() -> [Element] {
        
        // something happened here
        
    }
   
    private func bubble_sort() -> [Element] {
        
        // something happened here
        
    }
   
    public func sorted() -> [Element] {
        
        if self.count < 15 { // too small!!!
            
            return bubble_sort()
            
        } else {
            
            return quick_sort()
        }
    }
}
[/code]

Swift的Collection 係一個protocol
所以正常黎講寫extension 給Collection 就可以令所有collection 都有sorted呢個methods

由上面的例子可見
sorted method係public、而另外兩個methods係private

汪汪咁定義的目的非常明顯
因為sorted先係汪汪真正想公諸於世、給人使用的methods
其他想做override 、例如提升速度等
都應該replace呢個methods

其餘的兩個private methods 係汪汪自己的code需要使用
也不應該有其他人手多多override 左佢

呢個就正正係private methods的宗旨

Java的發展仲有慢慢長路
就好似以前如果Java要對Collection 做sorting
https://stackoverflow.com/questions/2477261/how-to-sort-a-collectiont

唔知係咪而家的新Java有新改善

form5 2017-11-14 10:03 PM

I think "protocol" in swift is more like abstract class than interface in C#/Java, it may have its own default implementation.
similar way in C# .
public abstract class MyComparable<TElement>
{
    private List<TElement> BubbleSort() { return ...; }
    private List<TElement> QuickSort() { return ... }

    public abstract List<TElement> Items { get; set; }
    public virtual List<TElement> Sorted()
    {
        if (Items.Count < 15)
        {
            return BubbleSort();
        }
        else
        {
            return QuickSort();
        }
    }
}

public class DefaultSortComparable<TElement> : MyComparable<TElement>
{
    public override List<TElement> Items { get; set; }
}

public class XSortComparable<TElement> : MyComparable<TElement> 
{
    private List<TElement> _XSort()
    {
        Items?.Sort();
        return Items;
    }

    public override List<TElement> Items { get; set; }
    public override List<TElement> Sorted()
    {
            return _XSort();
    }
}

form5 2017-11-14 10:12 PM

[quote]原帖由 [i]assembly.jc[/i] 於 2017-11-14 02:23 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470840228&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
5 兄提起,Java 9 interface 又有新功能,容許 interface 有 private methods, private static methods,作為 helper methods。

自從 interface 有了 default methods 之後,default methods implementation 可能 ... [/quote]
太多method 係interface 入面遲早出事,我估bob 大叔一早講明single responsibility都是有原因的

Susan﹏汪汪 2017-11-14 10:35 PM

[quote]原帖由 [i]form5[/i] 於 2017-11-14 10:03 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470881558&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
I think "protocol" in swift is more like abstract class than interface in C#/Java, it may have its own default implementation.
similar way in C# .
public abstract class MyComparable
... [/quote]
其實abstract class同interface
汪汪已經搞唔清兩者有咩明顯分別

form5 2017-11-14 10:49 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 10:35 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470883451&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

其實abstract class同interface
汪汪已經搞唔清兩者有咩明顯分別 [/quote]

阿姐,咪玩啦:lol

Susan﹏汪汪 2017-11-14 10:52 PM

[quote]原帖由 [i]form5[/i] 於 2017-11-14 10:49 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470884218&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]


阿姐,咪玩啦:lol [/quote]
你唔覺Java的interface同abstract class太似咩?

Swift evolution 曾經有人研究過swift到底需唔需要加入abstract class
最後結論係用protocol 就可以解決所有問題

form5 2017-11-14 11:00 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 10:52 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470884417&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

你唔覺Java的interface同abstract class太似咩?

Swift evolution 曾經有人研究過swift到底需唔需要加入abstract class
最後結論係用protocol 就可以解決所有問題 [/quote]
因為protocol 加extension 做到abstract class,
Java 7 或之前都冇甘似,J9 直情好鬼似

sswroom 2017-11-14 11:40 PM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 10:52 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470884417&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

你唔覺Java的interface同abstract class太似咩?

Swift evolution 曾經有人研究過swift到底需唔需要加入abstract class
最後結論係用protocol 就可以解決所有問題 [/quote]C++完全沒有分interface同abstract class, 而且那些function可以inherit, 那些function不可以inherit定得很清晰, 難道C++式的OO才是最終形態?

Susan﹏汪汪 2017-11-14 11:49 PM

[quote]原帖由 [i]sswroom[/i] 於 2017-11-14 11:40 PM 發表 [url=http://www.discuss.com.hk/redirect.php?goto=findpost&pid=470887113&ptid=27056751][img]http://www.discuss.com.hk/images/common/back.gif[/img][/url]
C++完全沒有分interface同abstract class, 而且那些function可以inherit, 那些function不可以inherit定得很清晰, 難道C++式的OO才是最終形態? [/quote]
有人討厭C++的multiple inheritance
汪汪一向覺得C++的OO好標準、但冇驚喜

而家應該都有好多語言有嚴格研定邊D methods 可inherit邊D唔可以

Java同Swift都有final做keyword

另外swift只有open methods先可以library 以外的code做override

https://github.com/apple/swift-evolution/blob/master/proposals/0117-non-public-subclassable-by-default.md

[[i] 本帖最後由 Susan﹏汪汪 於 2017-11-14 11:53 PM 編輯 [/i]]

assembly.jc 2017-11-15 12:45 AM

[quote]原帖由 [i]煙民母親生賤種[/i] 於 2017-11-14 02:56 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470840794&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
應一般 OOP 的概念, 應該是由自身 class 的 method call 起。所以應該係 output ***
正如 java inherit 一個 class, 個 constructor 內都要 call 一次 parent super() [/quote]


唔好意思,是 Hello 才對。private method 用 invokespecial call,唔會去找 Overrided method 的。

assembly.jc 2017-11-15 12:51 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 09:54 AM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470848126&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

Java 9個interface新功能似係受到swift影響

Swift已經發展出完整的protocol oriented programming

Java 9呢個新功能係習得其形習不得其神 [/quote]

估計只是為了減少 default methods 重覆代碼而且。如你所說,POP 精妙之處在於 value type,java 根本就無 value type 的概念,只有 primitive type 和 reference type。

assembly.jc 2017-11-15 01:10 AM

[quote]原帖由 [i]fitcat07[/i] 於 2017-11-14 12:46 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470855985&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
我記得interface內嘅private method係唔可以overridden。測試過證明冇記錯,顯示hello。


好處:減少重複碼。
壞處:設計時就要清楚default methods,如何call private methods。當釋出interface後,不能再修改 ... [/quote]
答對了。Interface private method 被視為 small language change,估計改動不涉及 JVM Spec,應和 abstract class 和 class 的 private methods 沒有分別。

至於加 access modifier 要改 class file format 會郁到 JVM Spec。用annotations 要防 reflection 存取,要改 SecurityManager。加 private method 可能是較簡單的方案。

另,當釋出interface後,點解連帶private methods亦不能改? 其他 classes 存取唔到,只要唔改 default method的行為,改 private methods 應該無問題。

assembly.jc 2017-11-15 01:20 AM

[quote]原帖由 [i]Susan﹏汪汪[/i] 於 2017-11-14 03:06 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470862014&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Java的發展仲有慢慢長路
就好似以前如果Java要對Collection 做sorting [url=https://stackoverflow.com/questions/2477261/how-to-sort-a-collectiont]https://stackoverflow.com/questions/2477261/how-to-sort-a-collectiont[/url]

唔知係咪而家的新Java有新改善[/quote]

Java 8 可以用 Stream 解决[code]// provided that T implements Comparable
Collection< T > collection = ...;
collection.stream().sorted();
or
collection.stream().sorted(new Comparator< T >( ){...});[/code]

assembly.jc 2017-11-15 01:22 AM

[quote]原帖由 [i]form5[/i] 於 2017-11-14 11:00 PM 發表 [url=http://computer.discuss.com.hk/redirect.php?goto=findpost&pid=470884895&ptid=27056751][img]http://computer.discuss.com.hk/images/common/back.gif[/img][/url]

因為protocol 加extension 做到abstract class,
Java 7 或之前都冇甘似,J9 直情好鬼似 [/quote]

有個好大分別就是 classes 可以 implements 多個 interfaces, 但只可以 extends 1 個 abstract class.
頁: [1] 2
查看完整版本: Java 9 Interface private methods